WPF c#带参数的设置样式

WPF c#带参数的设置样式,c#,wpf,C#,Wpf,我正在寻找一种方法来指定带有参数的样式(大多数只是文本)并指定给指定的块 <StackPanel Orientation="Horizontal"> <StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock x:Name="field1" Text="Field1"/> </StackPanel> &

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

<StackPanel Orientation="Horizontal">
    <StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock x:Name="field1" Text="Field1"/>
        </StackPanel>
    </StackPanel>
    <StackPanel>
        <Button BorderThickness="0">
            <Button.Content>
                <Border CornerRadius="18" BorderThickness="1" BorderBrush="#FFCFCFCF" >
                    <StackPanel Orientation="Horizontal">
                        <TextBlock  FontSize="10" Text="Default" Foreground="#FFCFCFCF" Margin="0" FontWeight="Black"/>
                    </StackPanel>
                </Border>
            </Button.Content>
        </Button>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <TextBlock x:Name="field2" Text="Field2"/>
        </StackPanel>
    </StackPanel>
    <StackPanel>
        <Button  BorderThickness="0">
            <Button.Content>
                <Border CornerRadius="18" BorderThickness="1" BorderBrush="#FFCFCFCF" >
                    <StackPanel Orientation="Horizontal">
                        <TextBlock FontSize="10" Text="RCC" Foreground="#FFCFCFCF" Margin="0" FontWeight="Black"/>
                    </StackPanel>
                </Border>
            </Button.Content>
        </Button>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <TextBlock x:Name="field3" Text="Field3"/>
        </StackPanel>
    </StackPanel>
    <Rectangle Width="1" Fill="Black" Height="42" VerticalAlignment="Center"/>
    <StackPanel Orientation="Horizontal">
        <Button  BorderThickness="0">
            <Button.Content>
                <Border CornerRadius="18" BorderThickness="1" BorderBrush="#FFCFCFCF" >
                    <StackPanel Orientation="Horizontal">
                        <TextBlock FontSize="10" Text="Custom" Foreground="#FFCFCFCF" FontWeight="Black"/>
                    </StackPanel>
                </Border>
            </Button.Content>
        </Button>
        <TextBox Width="90" Height="15"/>
        <Button  BorderThickness="0">
            <Button.Content>
                <Border CornerRadius="18" BorderThickness="1" BorderBrush="#FFCFCFCF" >
                    <StackPanel Orientation="Horizontal">
                        <TextBlock FontSize="10" Text="Apply" Foreground="#FFCFCFCF" FontWeight="Black"/>
                    </StackPanel>
                </Border>
            </Button.Content>
        </Button>
    </StackPanel>
</StackPanel>

有3个文本块(field1,field2,field3),现在有没有办法将参数(参数是字符串类型)传递给这个模板,这个模板是通过循环生成的。怎么做呢?当然,我可以用c#制作所有东西,但我认为只需创建字段(stackpanel)并分配参数就可以轻松得多

<stackpanel Style="{StaticResource mystyle}" param1="hello" param2="this" param3="world"/>


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

您可以通过声明自己的样式和控件模板,并额外使用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。组件的澄清遵循代码

<Window.Resources>
    <Style TargetType="{x:Type myApp:MyControl}" x:Key="MyControlStyle1">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type myApp:MyControl}" >
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{TemplateBinding MyText1}"/>
                        <TextBlock Text="{TemplateBinding MyText2}"/>
                        <TextBlock Text="{TemplateBinding MyText3}"/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <Style TargetType="{x:Type myApp:MyControl}" x:Key="MyControlStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type myApp:MyControl}" >
                    <StackPanel Orientation="Horizontal" Grid.Row="0">
                        <TextBlock Text="{TemplateBinding MyText1}"/>
                        <StackPanel>
                            <Button BorderThickness="0">
                                <Button.Content>
                                    <Border CornerRadius="18" BorderThickness="1" BorderBrush="#FFCFCFCF" >
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock  FontSize="10" Text="Default" Foreground="#FFCFCFCF" Margin="0" FontWeight="Black"/>
                                        </StackPanel>
                                    </Border>
                                </Button.Content>
                            </Button>
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                                <TextBlock Text="{TemplateBinding MyText2}"/>
                            </StackPanel>
                        </StackPanel>

                        <StackPanel>
                            <Button  BorderThickness="0">
                                <Button.Content>
                                    <Border CornerRadius="18" BorderThickness="1" BorderBrush="#FFCFCFCF" >
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock FontSize="10" Text="RCC" Foreground="#FFCFCFCF" Margin="0" FontWeight="Black"/>
                                        </StackPanel>
                                    </Border>
                                </Button.Content>
                            </Button>
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                                <TextBlock Text="{TemplateBinding MyText3}"/>
                            </StackPanel>
                        </StackPanel>
                        <Rectangle Width="1" Fill="Black" Height="42" VerticalAlignment="Center"/>
                        <StackPanel Orientation="Horizontal">
                            <Button  BorderThickness="0">
                                <Button.Content>
                                    <Border CornerRadius="18" BorderThickness="1" BorderBrush="#FFCFCFCF" >
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock FontSize="10" Text="Custom" Foreground="#FFCFCFCF" FontWeight="Black"/>
                                        </StackPanel>
                                    </Border>
                                </Button.Content>
                            </Button>
                            <TextBox Width="90" Height="15"/>
                            <Button  BorderThickness="0">
                                <Button.Content>
                                    <Border CornerRadius="18" BorderThickness="1" BorderBrush="#FFCFCFCF" >
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock FontSize="10" Text="Apply" Foreground="#FFCFCFCF" FontWeight="Black"/>
                                        </StackPanel>
                                    </Border>
                                </Button.Content>
                            </Button>
                        </StackPanel>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <!-- NOW, we can expand the custom properties-->
    <Style TargetType="{x:Type myApp:MyControl}" BasedOn="{StaticResource MyControlStyle}" />



</Window.Resources>


<Grid Height="150">
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
        <RowDefinition Height="50" />
        <RowDefinition Height="50" />
    </Grid.RowDefinitions>

    <myApp:MyControl MyText1="First String" MyText2="Second String" MyText3="Third String" 
        Style="{StaticResource MyControlStyle}"/>

    <myApp:MyControl MyText1="Another Line" MyText2="diff string" MyText3="all done" Grid.Row="1"/>

    <myApp:MyControl MyText1="Another Line" MyText2="diff string" MyText3="all done" Grid.Row="2"
        Style="{StaticResource MyControlStyle1}"/>

</Grid>

这基本上表明,在这个xaml文件中,我看到一个前缀“myApp”,它类似于代码中的“using StackOverflow;”命令。因此,现在我可以访问自定义类或该名称空间中的其他东西来访问xaml

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

<Window.Resources>
    <Style TargetType="{x:Type myApp:MyControl}" x:Key="MyControlStyle1">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type myApp:MyControl}" >
控件模板绑定到的类(因此为TemplateBinding)

一旦基本工作正常,就可以像使用嵌套的堆栈面板一样美化模板,堆栈面板位于较低的位置

<Style TargetType="{x:Type myApp:MyControl}" x:Key="MyControlStyle"> 

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

DOD,您考虑使用数据绑定吗?一切似乎都好,但是忘了提到生成是通过C中的循环来表示的(int i=0;i<10;i++){SttPosikTest=新StApPANELL();test .style =“我定义的样式”。//现在我要查找的部分是test.mydefinedfirstparam=“test”+i.ToString();//此行应将此参数分配给Field1,这意味着定义的样式仅用于模板,参数仅通过C#分配,我通过循环对象创建并为其分配类,然后分配参数。使用用户控件并生成大量几乎相同的项不会影响性能?@JonZ,future。不要这样做多条评论。在底部编辑您的原始帖子,放置上下文,然后通知回答的用户进行检查。我已修改了我的答案…请参阅帖子底部。修改后一切正常@DRapp谢谢您的帮助。
Text="{TemplateBinding MyText1}"  
<Style TargetType="{x:Type myApp:MyControl}" x:Key="MyControlStyle"> 
<Style TargetType="{x:Type myApp:MyControl}" BasedOn="{StaticResource MyControlStyle}" />
<myApp:MyControl MyText1="First String" MyText2="Second String" MyText3="Third String" 
            Style="{StaticResource MyControlStyle}"/>

        <myApp:MyControl MyText1="Another Line" MyText2="diff string" MyText3="all done" Grid.Row="1"/>

        <myApp:MyControl MyText1="Another Line" MyText2="diff string" MyText3="all done" Grid.Row="2"
            Style="{StaticResource MyControlStyle1}"/>
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 );
}