Tag: xaml

有没有办法在WPF控件库中使用StaticResource并能够在设计时查看?

我有一个WPF控件库,正在添加到Windows窗体应用程序。 我们希望允许控件可以本地化,但是我不知道如何在不重复代码的情况下完全实现这一点。 这就是我现在正在做的事情 。 基本上,在Windows窗体应用程序中,在主应用程序启动之前,我正在实例化一个存在于窗体应用程序中的App.xaml(包含我的资源的链接,它们也存在于窗体应用程序中)。 这适用于运行时。 但是,我的用户控件都有Content=”{StaticResource SomeVariableName}” ,最终为空。 我可以通过在我的控件库中使用app.xaml和相应的资源字典来匹配我的Windows窗体应用程序中的字典来解决这个问题。 但是,这是重复的代码。 我已经尝试过的事情无济于事: 从我的表单应用程序中实例化位于用户控件库中的App.xaml。 这不起作用,因为我的资源的URI正在寻找嵌入式资源,而不是我的本地资源字典(我可以简单地将资源文件从控件复制到构建中的表单应用程序中的适当位置)。 我可以在这里利用DeferrableContent吗? 尽管如此,据我所知,这个属性并没有太多在线以及如何使用它。 我想对App和词典使用post构建,但是,就我所知,App实例化是对已编译的App.xaml的静态引用。 因此,App.xaml必须至少存在于表单中 我确实尝试了一个重复的App.xaml,后期构建移动了resourcedictionary.xaml。 我认为重复的app.xaml是可以的,因为这是驱动力,你可能不想依赖于控件中的一个(它回转并让你想知道你是否应该在控件中有App.xaml所有?除非你想允许使用嵌入式资源的默认值….)即使它被放置在URI本应指向的位置,它也无法找到资源。 反编译的代码指向Uri resourceLocater = new Uri(“/WindowsFormsApplication3;component/app.xaml”, UriKind.Relative); 那么,有没有办法让它工作并且设计时间查看组件默认值并避免重复? 或者,在这种情况下复制是否正常? 如果我的第二个子弹的子项似乎没问题(复制App.xaml与构建复制资源),如何使它不查找组件级项目,而是查找文件级别? 我刚刚注意到的最后一个问题(我可以在必要时单独发布)。 我的App.xaml正在内置到代码中,因此无论如何都不允许我动态创建新的ResourceDictionaries。 有没有办法做到这一点? 最后的选择……可能是最好的选择? – 无论如何我打算使用Andre van Heerwaarde的代码 ,所以我应该检查文件是否存在并将其作为合并资源即时添加? 基本上,我的用户控件中有一个App.xaml链接到默认的嵌入式ResourceDictionary。 然后,让代码在运行中寻找适当的本地化资源,这可能是相对文件路径? 我在这里看到的唯一缺点是默认情况下无法动态改变…我甚至可以在指定的地方看到(使用某种约定)并且优先于内置的? 哦,我不想要嵌入式资源的原因是最终用户可以在部署构建之后添加/修改新的本地化资源。 我可以添加代码,如果它可以帮助您更好地可视化,请告诉我。 UPDATE 我现在遇到了造型的另一个问题,而不仅仅是本地化。 以下是其中一个控件上的一个内部按钮的示例: <Button Style="{StaticResource GrayButton}" 我尝试/想过的更多事情: 我无法创建一个app.xaml(永远不会被使用)与ResourceDictionary设置为ApplicationDefinitions不允许在库项目中。 我可以将它嵌入控件的资源中,但随后它总是优先于任何应用程序级资源,并且我失去了可自定义性。 这是一个实际上听起来像我正在寻找的连接案例 ,但它没有提供任何真正的解决方案 我能想到的解决方案(超出顶部…不起作用)可能会起作用(并且尚未尝试),对于我认为应该简单的事情,似乎也有很多工作要做。 […]

可以在WPF中使用与XAML 2009相关的标记扩展吗?

我在谈论扩展,例如x:Reference和x:FactoryMethod , 这里集体出现。 我在网上阅读了很多相互矛盾的信息,包括MSDN,Stackoverflow和其他来源。 我将以x:Reference为例进行讨论,但我实际上也指的是其他标记扩展。 混淆的主要原因如下MSDN的摘录: WPF中的XAML 2009语言支持 在WPF中,您可以使用XAML 2009function,但仅适用于非WPF标记编译的XAML。 标记编译的XAML和BAMLforms的XAML目前不支持XAML 2009语言关键字和function。 请注意,在WPF中加载松散XAML的现有技术也可能对CLR类型和类型系统有安全性和访问限制,这些限制比标记编译的XAML更具限制性。 有关更多信息,请参阅安全性(WPF)或WPF安全策略 – 平台安全性。 XAML 2009还引入了其他function,可以修改以前的XAML 2006构造或修改基本标记表单。 x:参考标记扩展 x:Reference是在XAML 2009中定义的构造。在WPF中,您可以使用XAML 2009function,但仅适用于非WPF标记编译的XAML。 标记编译的XAML和BAMLforms的XAML目前不支持XAML 2009语言关键字和function。 但是,以下段落出现在前一段之前(即关于x:Reference那一段)。 在WPF和XAML 2006中,元素引用由ElementName绑定的框架级function处理。 对于大多数WPF应用程序和方案,仍应使用ElementName绑定。 此一般指导的例外情况可能包括存在数据上下文或其他范围考虑因素的情况,这些因素使得数据绑定不切实际且不涉及标记编译。 这里没有直接的矛盾,但这一段似乎说可以在应用程序中使用x:Reference 。 此外,关于x:Reference段落似乎是自动生成的,可能已经过时了。 然后,我们从“WPF 4 Unleashed”一书中摘录如下: x:引用标记扩展通常与XAML2009function错误关联,这些function只能在撰写本文时从松散的XAML中使用。 虽然x:Reference是WPF 4中的一个新function,但只要您的项目针对.NET Framework的版本4或更高版本,就可以在XAML2006中使用它。 我们还有以下Stackoverflow问题,其中一些问题的答案相互矛盾,而且没有一个明显正确: 什么是x的替代品:参考? XAML 2009 – x:参考 – 使用它的任何缺点? 何时是x:WPF中的引用已解决,为什么XAML元素顺序会影响它? 最后,我个人使用x:Reference扩展,它似乎在WPF应用程序中工作,无论MSDN说什么,即使Visual Studio有时会抱怨奇怪的事情(或者它可能是ReSharper),例如在标记。 了解实际问题, 可以在WPF应用程序中使用XAML 2009(全部或部分)吗? 这些特定扩展可以用于编写WPF应用程序吗? […]

为什么在XAML中绑定MainWindow datacontext的行为与使用this.datacontext = this的代码隐藏中的绑定相同?

我正在尝试使用Data绑定将ObservableCollection绑定到DataGrid的ItemsSource,因为我了解了WPF和其他内容。 在代码隐藏中,我可以使用this.DataContext = this;设置DataContext this.DataContext = this; 或bloopDataGrid.DataContext = this; 。 这很好,花花公子。 我以为我可以尝试类似的东西 在我的主窗口中,但这会导致Stack Overflowexception,如本问题中所述 。 很好,这是有道理的。 在阅读了这个以及在窗口的XAML代码中尝试DataContext=”{Binding RelativeSource={RelativeSource Self}}”其他问题/答案之后,我想我实际上可以做到这一点 。 显然我做不到 。 或者至少,IDE让我和它的语法正确,但不做我想要的(即,究竟是什么this.DataContext = this; )。 然后我读到这个关于使用”{Binding ElementName=, Path=}”并试图像这样使用它: 哪个也行不通。 也许不是出于同样的原因,但我无法弄清楚它的问题。 奇怪的是,我无法复制Rachel Lim博客文章中显示的重新绑定示例。 XAML: C#: using System; using System.Collections.ObjectModel; //For ObservableCollection using System.Windows; namespace DataBinding { public partial class MainWindow : Window { public […]

重用XAML块的最佳方法是什么?

我有很多这样的用户控件: PageManageCustomers.xaml.cs: public partial class PageManageCustomers : BasePage { … } inheritance自: PageBase.cs: public class BasePage : UserControl, INotifyPropertyChanged { … } 由于PageBase.cs 没有附带的XAML文件 ,我必须将它引用的XAML放在每个inheritance它的用户控件中,例如,在inheritancePageBase的每个控件的每个 XAML文件中重复以下块: 我正在尝试将此块放入资源文件但无法正确获取语法,它说: ‘ResourceDictionary’根元素需要ax:Class属性来支持XAML文件中的事件处理程序。 删除MouseDown事件的事件处理程序,或将x:Class属性添加到根元素。 或者也许我可以用XamlReader以某种方式读取这些块? 如何将这个重复的代码块放在一个地方,以便在每个inheritanceBagePage的XAML文件中不重复它? 以下是此问题的可重现示例: Window1.xaml: Window1.xaml.cs: using System.Windows; namespace TestXamlPage8283 { public partial class Window1 : Window { public Window1() { InitializeComponent(); Page1 page1 = new Page1(); […]

Xaml TextBlock设置圆角

我试图在xaml设置TextBlock圆角。 但是没有这样的财产。 如何设置TextBlock的圆角。 并且还想设置TextBlock的背景颜色。

如何在WPF中绘制窗口(最佳实践)?

我正在尝试编写一个类似于交互式游戏的小应用程序,我需要有一个Draw方法,它将在屏幕上绘制,但无法弄清楚如何构建WPF方法。 如果这是Winforms ,我可以使用: public void Draw (Graphics g) { } 但是对于WPF Window ,我应该在xaml中拥有什么(目前只有一个Grid ),这个Draw方法应该作为参数接收什么? 首先,我想这样做才能让它工作,然后我可以考虑如何使它更多WPF等。但现在我更感兴趣的是让它工作。

DynamicResources是如何构建的以及它们在上下文中的用法

动态资源真的是动态的吗? 如果我定义一个DynamicResource,我意识到一个表达式被创建(在哪里?),直到运行时才被转换为资源,但是,我不会理解的是,这个动态结构,一旦构建,现在是“静态” 例如,如果我通过动态资源创建一个上下文菜单,那么在运行时在访问时创建的菜单项是静态的,即使它们是绑定的吗? 如果是这样,我如何在XAML中创建动态上下文菜单?

在combobox中使用转换器绑定项目

我有一个combobox,它绑定到数据表列,如下所示: ComboBox.DataContext = DataDataTable; ComboBox.DisplayMemberPath = DataDataTable.Columns[“IDNr”].ToString(); 列中的IDNr始终以4个字母开头,后跟ID号(例如BLXF1234)。 我需要在没有字母的情况下显示Combobox中的项目(我需要在combobox中显示1234)。 所以我写了一个转换器: class IDPrefixValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value != null) { string s = value.ToString(); if (s.Contains(“BL”)) { return s.Substring(4); } else { return s; } } return “”; } public object ConvertBack(object value, Type […]

如何使WPF样式可inheritance到派生类?

在我们的WPF应用程序中,我们有一个TargetType={x:Type ContextMenu}的全局样式。 我创建了一个派生自ContextMenu的MyContextMenu,但现在默认样式不适用。 如何告诉WPF我希望MyContextMenu从ContextMenuinheritance默认样式? 希望我可以从我的控制本身(通过静态ctor元数据覆盖或其他什么?)中做到这一点,而不必在任何xaml中乱七八糟。

Style.Triggers与ControlTemplate.Triggers

我应该何时选择Style.Triggers ,何时应该选择ControlTemplate.Triggers ? 使用一个在另一个上有什么好处吗? 假设我有这些样式可以达到相同的效果: … … …