WPF c#设置样式与参数

我正在寻找一种方法来分配带参数的样式(大多数只是文本)并分配给指定的块

                             

有3个TextBlocks(field1,field2,field3),现在有任何方法可以将参数(参数是字符串类型)传递给此模板,并且此模板是通过循环生成的。 怎么做? 当然,我可以在c#中创建所有内容但是认为创建字段(stackpanel)和分配参数会更容易

  

如果可以这样做,这将是完美的。 除非有更好的。 感谢帮助。

您可以通过额外使用DependencyProperties声明自己的样式和控件模板。

DependencyProperty基本上是您自己的自定义属性的自定义类的声明,您希望在xaml条目期间公开它,并且也可以应用于您的样式模板。

完成后,您就可以定义自己的风格,充足的资源。 将您的依赖项属性作为{TemplateBinding}包含在自定义属性中。

然后将新类的实例添加到表单中,并指定要使用的样式。 我有一个示例显示在同一个类下使用两种样式。 我首先开始使用全新的WPF应用程序。 在MainWindow.xaml.cs中,我根据UserControl的类型定义了自己的类(然后可以保存任何其他控件,例如嵌套)。 我添加了3个依赖项属性以反映您想要实现的3个可能的文本值。

 public class MyControl : UserControl { public static readonly DependencyProperty MyText1Property = DependencyProperty.Register("MyText1", typeof(string), typeof(MyControl), new UIPropertyMetadata("")); public string MyText1 { get { return (string)GetValue(MyText1Property); } set { SetValue(MyText1Property, value); } } public static readonly DependencyProperty MyText2Property = DependencyProperty.Register("MyText2", typeof(string), typeof(MyControl), new UIPropertyMetadata("")); public string MyText2 { get { return (string)GetValue(MyText2Property); } set { SetValue(MyText2Property, value); } } public static readonly DependencyProperty MyText3Property = DependencyProperty.Register("MyText3", typeof(string), typeof(MyControl), new UIPropertyMetadata("")); public string MyText3 { get { return (string)GetValue(MyText3Property); } set { SetValue(MyText3Property, value); } } } 

接下来,我的应用程序名称是StackOverflow用于示例目的,以下是整个MainWindow.xaml。 组件的澄清遵循代码。

                 

在主要声明的顶部,我补充说

  xmlns:myApp="clr-namespace:StackOverflow" 

这基本上说明当在这个xaml文件中,我看到“myApp”的前缀,它类似于“使用StackOverflow;” 命令就像在代码中一样。 所以现在我可以访问xaml中的自定义类或该命名空间中的其他内容。

接下来,我开始为自定义MyControl类声明自己的“样式”

   

如果您处理整个应用程序中使用的许多样式/模板,则可能需要创建单独的ResourceDictionary。 请注意,“Syle”和自定义“ControlTemplate”基于“myApp:MyControl”类结构。 现在,我可以在控件模板中使用我的“MyText1”,“MyText2”,“MyText3”元素。

x:Key =“MyControlStyle1”就像通过给定名称创建变量,因此如果您需要明确说明要使用哪种样式,则可以使用它。 第一种风格只是为了表明3“MyText”属性可用,而Text正在从中获取其值

 Text="{TemplateBinding MyText1}" 

控件模板绑定的类(因此为TemplateBinding)。

一旦你掌握了基础知识,你就可以像嵌入式堆栈面板一样美化你的模板

  

由不同的x声明:键名。

现在,所以你不必明确地继续为你的控件添加xaml并说…顺便说一下,使用MyControlStyle的这个显式样式,我有以下内容

  

指示无论何时看到目标类型“MyControl”,都将样式默认为“MyControlStyle”,这样我就不必记住这样做了。

最后实现其使用。 代码的结尾有一个简单的Grid控件,有3行。

    

注意第一个实例我可以明确声明要使用的样式。 第二个没有默认的显式样式,但第三个实例明确指出使用简化的“MyControlStyle1”,它只是3个文本块并排显示您可以拥有一个类,并根据需要使其外观不同。

每个问题/评论的修订。

如果要基于循环构建这些控件并动态添加它们,则只需在代码中分别设置属性。 性能不应该很重要,因为已经声明了CLASS,您只需在列表中添加一个。

 foreach( var oneThing in YourListOfToBeAddedItems ) { var mc = new MyControl(); mc.MyText1 = oneThing.TextFieldUsedForField1; mc.MyText2 = oneThing.FieldForSecondText; mc.MyText3 = oneThing.ThirdTextBasisForDisplay; // Now, add the "mc" to whatever your control is // can't confirm this line below as I dont know context // of your form and dynamic adding. YourWindowGridOrOtherControl.Controls.Add( mc ); } 

此外,由于定义了默认样式,我不需要为控件显式声明“样式”。