【问题标题】:Binding a control property to a style将控件属性绑定到样式
【发布时间】:2018-03-28 14:23:53
【问题描述】:

我有一个忙碌的装饰器,如下所示

<controls:BusyDecorator x:Name="Busy" BusyStyle="{StaticResource busyStyle}" FadeTime="00:00:00.2" IsBusyIndicatorShowing="{Binding IsBusy}" Tag="Description">

还有风格

<Style x:Key="busyStyle" TargetType="{x:Type Control}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Control}">
                <ControlTemplate.Resources>
                    <Style TargetType="{x:Type Rectangle}">
                        <Setter Property="Width" Value="8" />
                        <Setter Property="Height" Value="16" />
                        <Setter Property="Stroke" Value="Black" />
                        <Setter Property="StrokeThickness" Value="1" />
                        <Setter Property="RadiusX" Value="2" />
                        <Setter Property="RadiusY" Value="2" />
                        <Setter Property="RenderTransformOrigin" Value=".5,.5" />
                    </Style>
                </ControlTemplate.Resources>
                <Canvas Width="64" Height="64">
                    <Rectangle Canvas.Left="24">
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="top" Color="#DFDFDF" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <Rectangle Canvas.Left="10" Canvas.Top="6">
                        <Rectangle.RenderTransform>
                            <RotateTransform Angle="-45" />
                        </Rectangle.RenderTransform>
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="topLeft" Color="#DFDFDF" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <Rectangle Canvas.Top="24" Width="16" Height="8">
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="left" Color="#DFDFDF" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <Rectangle Canvas.Left="10" Canvas.Top="34">
                        <Rectangle.RenderTransform>
                            <RotateTransform Angle="45" />
                        </Rectangle.RenderTransform>
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="bottomLeft" Color="#DFDFDF" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <Rectangle Canvas.Left="24" Canvas.Top="40">
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="bottom" Color="#DFDFDF" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <Rectangle Canvas.Left="38" Canvas.Top="34">
                        <Rectangle.RenderTransform>
                            <RotateTransform Angle="-45" />
                        </Rectangle.RenderTransform>
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="bottomRight" Color="#DFDFDF" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <Rectangle Canvas.Top="24" Canvas.Left="38" Width="16" Height="8">
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="right" Color="#DFDFDF" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <Rectangle Canvas.Left="38" Canvas.Top="6">
                        <Rectangle.RenderTransform>
                            <RotateTransform Angle="45" />
                        </Rectangle.RenderTransform>
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="topRight" Color="#DFDFDF" />
                        </Rectangle.Fill>
                    </Rectangle>
                    <TextBlock Canvas.Left="1" Canvas.Top="64" FontSize="11" Foreground="White" Text="{TemplateBinding Tag}" />
                </Canvas>

我想要的是能够在运行时将微调器上的文本设置为我喜欢的任何内容。现在我在 Tag 属性上将它硬编码为 POC,但我没有在微调器中显示任何文本。如果我改变了

{TemplateBinding Tag}

在样式的底部为一个普通的硬编码文本值,它显示文本。

如何从父控件传播文本字符串以显示在样式渲染上?

更新

我有一个类表示这个控件,如下

 [StyleTypedProperty(Property = "BusyStyle", StyleTargetType = typeof (Control))]
    public class BusyDecorator : Decorator
{
#region IsBusyIndicatorShowing Property

        /// <summary>
        /// Identifies the IsBusyIndicatorShowing dependency property.
        /// </summary>
        public static readonly DependencyProperty IsBusyIndicatorShowingProperty = DependencyProperty.Register(
            "IsBusyIndicatorShowing",
            typeof (bool),
            typeof (BusyDecorator),
            new FrameworkPropertyMetadata(false,
                                          FrameworkPropertyMetadataOptions.AffectsMeasure,
                                          OnIsShowingChanged));

        /// <summary>
        /// Gets or sets if the BusyIndicator is being shown.
        /// </summary>
        public bool IsBusyIndicatorShowing
        {
            get { return (bool) GetValue(IsBusyIndicatorShowingProperty); }
            set { SetValue(IsBusyIndicatorShowingProperty, value); }
        }

由于样式以 Control 类型为目标,因此我无法将模板绑定到我在 BusyDecorator 类型上创建的依赖项属性。如果我将样式的 TargetType 更改为“BusyDecorator”,它会说找不到模板属性?

【问题讨论】:

    标签: wpf xaml resourcedictionary


    【解决方案1】:

    我相信,通过指定{TemplateBinding Tag} Textblock 指的是它自己的标签,您可能应该考虑创建一个自定义控件,并将您的BusyContent 作为该控件中的DependencyProperty。 然后可以指定{TemplateBinding BusyContent}

    【讨论】:

    • 刚刚添加了一些额外的细节,请您看看,如果我做得对,请告诉我?
    • “由于样式以控件类型为目标,因此我无法将模板绑定到我在 BusyDecorator 类型上创建的依赖项属性”,这是正确的,这就是此 XAML 进入 Generic.xaml 文件的原因。有很多文章解释了如何在 WPF 中创建自定义控件,通常它存在于单独的类库中。
    • 自定义控件是相当棘手的事情。你需要重新模板吗?用户控件会更简单。如果您不需要重新模板。
    【解决方案2】:

    BusyDecorator 应该是Control

    public class BusyDecorator : Control
    ...
    

    ...Template:

    <Style x:Key="busyStyle" TargetType="{x:Type local:BusyDecorator}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Control}">
                    <ControlTemplate.Resources>
                        <Style TargetType="{x:Type Rectangle}">
                            <Setter Property="Width" Value="8" />
                            <Setter Property="Height" Value="16" />
                            <Setter Property="Stroke" Value="Black" />
                            <Setter Property="StrokeThickness" Value="1" />
                            <Setter Property="RadiusX" Value="2" />
                            <Setter Property="RadiusY" Value="2" />
                            <Setter Property="RenderTransformOrigin" Value=".5,.5" />
                        </Style>
                    </ControlTemplate.Resources>
                    <Canvas Width="64" Height="64">
                        <Rectangle Canvas.Left="24">
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="top" Color="#DFDFDF" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <Rectangle Canvas.Left="10" Canvas.Top="6">
                            <Rectangle.RenderTransform>
                                <RotateTransform Angle="-45" />
                            </Rectangle.RenderTransform>
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="topLeft" Color="#DFDFDF" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <Rectangle Canvas.Top="24" Width="16" Height="8">
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="left" Color="#DFDFDF" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <Rectangle Canvas.Left="10" Canvas.Top="34">
                            <Rectangle.RenderTransform>
                                <RotateTransform Angle="45" />
                            </Rectangle.RenderTransform>
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="bottomLeft" Color="#DFDFDF" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <Rectangle Canvas.Left="24" Canvas.Top="40">
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="bottom" Color="#DFDFDF" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <Rectangle Canvas.Left="38" Canvas.Top="34">
                            <Rectangle.RenderTransform>
                                <RotateTransform Angle="-45" />
                            </Rectangle.RenderTransform>
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="bottomRight" Color="#DFDFDF" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <Rectangle Canvas.Top="24" Canvas.Left="38" Width="16" Height="8">
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="right" Color="#DFDFDF" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <Rectangle Canvas.Left="38" Canvas.Top="6">
                            <Rectangle.RenderTransform>
                                <RotateTransform Angle="45" />
                            </Rectangle.RenderTransform>
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="topRight" Color="#DFDFDF" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <TextBlock Canvas.Left="1" Canvas.Top="64" FontSize="11" Foreground="Blue" Text="{TemplateBinding Tag}" />
                    </Canvas>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    然后这个工作:

    <local:BusyDecorator x:Name="Busy" Style="{StaticResource busyStyle}" Tag="Description" />
    

    Decorator 没有任何模板,您也不能将带有TargetTypeControlStyle 应用到Decorator

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 1970-01-01
      • 2021-01-11
      • 2015-08-26
      • 1970-01-01
      • 2014-05-23
      • 2018-06-09
      • 2019-12-17
      • 1970-01-01
      相关资源
      最近更新 更多