首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF - RelativeSource风格

WPF - RelativeSource风格
EN

Stack Overflow用户
提问于 2013-08-25 16:16:08
回答 1查看 11.6K关注 0票数 12

我的目标是将标签的Content-Property绑定到应用样式的元素的标记-Property。但我的解决方案似乎行不通:

我的风格:

代码语言:javascript
复制
<Style
   TargetType="TextBox"
   x:Key="HintedTextBox">
   <Style.Resources>
      <VisualBrush
         AlignmentX="Left"
         AlignmentY="Center"
         Stretch="None"
         x:Key="HintedTextBox_Hint">
         <VisualBrush.Visual>
            <Label
               Content="{Binding RelativeSource={RelativeSource Self}, Path=Tag}"
               Foreground="LightGray" />
         </VisualBrush.Visual>
      </VisualBrush>
   </Style.Resources>
   <!-- Triggers -->
</Style>

我的文本框:

代码语言:javascript
复制
<TextBox
   Style="{StaticResource ResourceKey=HintedTextBox}"
   x:Name="tbTest" />
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-25 17:27:53

如果我正确理解,您希望为VisualBrush设置文本,这将显示在TextBox中。

你可以这样做:

代码语言:javascript
复制
<TextBox Name="MyTextBox" Tag="MyNewValue" Width="100" Height="25">
    <TextBox.Background>
        <VisualBrush AlignmentX="Left" AlignmentY="Center" Stretch="None">
            <VisualBrush.Visual>
                <Label Content="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Tag}" Foreground="LightGray" />
            </VisualBrush.Visual>
        </VisualBrush>
    </TextBox.Background>
</TextBox>

为了解释为什么你的例子不值得:

正如您可能理解的那样,在我的示例中,1.必须不是RelativeSource,在这种情况下,它将指向自身(VisualBrush),并且类型为TextBox的元素必须位于可视化树的较高位置。

2.RelativeSource绑定在资源中不起作用,因为Resource不是可视树的一部分,也不是模板的一部分。

3.在样式上这个构造将无法工作,因为Style只是设置者的集合,他不知道控制,都在那里。为此目的,通常使用DataTemplateControlTemplate

作为另一种选择,在本例中,我建议为TextBox使用一个模板,它将被注册为VisualBrush

以下是我的例子:

代码语言:javascript
复制
<Window.Resources>            
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="SnapsToDevicePixels" Value="True" />
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="KeyboardNavigation.TabNavigation" Value="None" />
        <Setter Property="FocusVisualStyle" Value="{x:Null}" />
        <Setter Property="MinWidth" Value="120" />
        <Setter Property="MinHeight" Value="20" />
        <Setter Property="AllowDrop" Value="true" />

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBoxBase}">
                    <Border Name="Border" CornerRadius="0" Padding="2" BorderThickness="1" BorderBrush="Black">
                        <Border.Background>
                            <VisualBrush AlignmentX="Left" AlignmentY="Center" Stretch="None">
                                <VisualBrush.Visual>
                                    <Label Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}"
                                           Foreground="LightGray" />
                                </VisualBrush.Visual>
                            </VisualBrush>
                        </Border.Background>

                        <ScrollViewer Margin="0" x:Name="PART_ContentHost" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid>
    <TextBox Name="MyTextBox" Tag="MyNewValue" Width="100" Height="25" />        
</Grid>

Output

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18431043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档