none
在xaml中,如何给一个引用自己设置的style的具体控件对象添加几个自定义属性,并且在style中的ControlTemplate内使用这些自定义属性? RRS feed

  • 问题

  • 在xaml中,我写了某种控件的style,其内部也设置了Template,绘制自己想要的控件模板。然后在窗体中拖该类控件,并引用自己设置的style,然后我能不能给该控件对象设置自定义属性,然后使我设计的style内的ControlTemplate的内容(包括ControlTemplate.Triggers)使用这些自定义属性?

    例如需求:设计了TextBox的style,内部也绘制了ControlTemplate,内部添加了一个用于提示输入内容的Textblock,设置触发器IsKeyboardFocused,如果TextBox获得焦点,这个Textblock的Visibility变为Collapsed。然后有个问题,我怎么在引用该Style的TextBox对象的xaml标签中传入我想提示的文字到style内的ControlTemplate内的Textblock的text属性中?我能不能在TextBox的xaml标签上写一个自定义的属性(名称PromptText,string类型),然后把在TextBox的ControlTemplate内把TextBlock的Text写成{TemplateBinding PromptText}?进而可以在TextBox控件对象xaml标签设置提示文字?

    用Tag属性是不行的,如果写成{TemplateBinding Tag},会提示错误“表达式类型不是有效的 Style 值”,而且就算能,Tag也只能传入一个值,如果会传多个值,不知怎么判断

    例如需求2:设计了ToggleButton的Style,内部也绘制了ControlTemplate,内部添加一个TextBlock,在触发器设置IsChecked触发操作,其Setter标签的value值为true状态下的内容设置可以从引用该style的控件对象传入我想设置的值吗??我能不能在ToggleButton的xaml标签上写一个自定义的属性(名称TrueText,string类型),然后把在ToggleButtonControlTemplate内把TextBlock的Text写成{TemplateBinding TrueText}?进而可以在ToggleButton控件对象xaml标签中设置ToggleButton的IsChecked为true状态下,ToggleButton的Content要显示的内容?

    除了继承控件添加属性,有哪些方法?



    • 已编辑 Trian555 2019年1月9日 1:51
    2019年1月8日 9:48

答案

  • 其实 你用UID作为传递参数就可以了

    当然了 你要自定义属性也可以

    可参考

    附加属性

    依赖属性

    UID和附加属性的方法我给出了 依赖属性和附加属性的用法差不多 可自行百度

    下面是UID的骚操作

    第一个

     <Grid Background="Transparent">
            <TextBox x:Name="TBC" Uid="测试背景"  BorderBrush="Red"  BorderThickness="2"  Height="38" Width="398">
                <TextBox.Template>
                    <ControlTemplate TargetType="TextBox">
                        <TextBox Text="{TemplateBinding  Text}" 
                                 Uid="{TemplateBinding Uid}"
                                 Height="{TemplateBinding Height}" 
                                 Width="{TemplateBinding Width}"
                                 Background="{TemplateBinding Background}" 
                                 BorderBrush="{TemplateBinding BorderBrush}" 
                                 BorderThickness="{TemplateBinding BorderThickness}">
                        </TextBox>
                    </ControlTemplate>
                </TextBox.Template>
                <TextBox.Resources>
                    <VisualBrush x:Key="VB"  Opacity="0.3" Stretch="None" AlignmentX="Left" AlignmentY="Top">
                        <VisualBrush.Visual>
                            <TextBlock Text="{Binding ElementName=TBC, Path=Uid}"/>
                        </VisualBrush.Visual>
                    </VisualBrush>
                </TextBox.Resources>
                <TextBox.Style>
                    <Style TargetType="TextBox">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Background"  Value="{StaticResource  VB}"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="false">
                                <Setter Property="Background"  Value="Transparent"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>
            
        </Grid>

    第二个

    除了DataContext 直接赋值 还可以通过定义好资源再通过 绑定来给赋值不过控件引用时 要注意路径问题

     <ToggleButton x:Name="ToB" Content="CheckTest" Uid="TOB提示" Grid.Row="1" Height="128" Width="128" >
                <ToggleButton.Template>
                    <ControlTemplate TargetType="ToggleButton">
                        <Grid x:Name="G"
                            DataContext="x"
                            Height="{TemplateBinding Height}"
                            Width="{TemplateBinding Width}"
                            Background="{TemplateBinding Background}"
                            Uid="{Binding RelativeSource={RelativeSource Mode=Self }, Path=DataContext}"
                            >
                            <CheckBox x:Name="CB" Content="{Binding RelativeSource={ RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=Grid}, Path=Uid}" IsChecked="{TemplateBinding IsChecked}"/>
                            <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Uid}" VerticalAlignment="Center" HorizontalAlignment="Center" />
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger  Property="IsMouseOver" Value="true">
                                <Setter TargetName="G" Property="DataContext" Value="鼠标经过"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                   
                </ToggleButton.Template>
            </ToggleButton>

    附加属性的方法

    附加类

      public  class TIGO
        {
            public static readonly DependencyProperty PoupProperty = DependencyProperty.RegisterAttached( "Poup",typeof(string),typeof(TIGO),new PropertyMetadata("默认提示",new PropertyChangedCallback(CallBackForSet)));
    
            private static void CallBackForSet(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                var text = d as TextBox;
    
                VisualBrush visual = new VisualBrush(new TextBlock() { Text=e.NewValue.ToString()});
    
                text.Background = visual;
            }
    
            public static string GetPoup(DependencyObject dependencyObject) => (string)dependencyObject.GetValue(PoupProperty);
    
            public static void SetPoup(DependencyObject dependencyObject, string value) => dependencyObject.SetValue(PoupProperty, value); 
        }

      <TextBox Grid.Row="2" Height="128" >
                <TextBox.Style>
                    <Style TargetType="TextBox">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="local:TIGO.Poup" Value="背景"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="false">
                                <Setter Property="local:TIGO.Poup" Value=""/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>


    • 已编辑 ARM830 2019年1月9日 3:49
    • 已标记为答案 Trian555 2019年1月16日 2:23
    2019年1月8日 15:06