【问题标题】:Applying BorderBrush of TextBox to BorderBrush of a Border dynamically将TextBox的BorderBrush动态应用到Border的BorderBrush
【发布时间】:2016-07-18 09:24:46
【问题描述】:

我的应用程序中有TextBoxesFakeTextBoxesFakeTextBoxes 相当于 TextBoxes,但它们具有更多功能,因为它们具有按钮和/或内部图像。 XAML FakeTextBox 看起来像这样:

                <Border BorderThickness="1">
                    <StackPanel Orientation="Horizontal">
                        <TextBox BorderThickness="0" />
                        <Button>I'm a button inside textbox</Button>
                    </StackPanel>
                </Border>

TextBox 在我的项目中有一个自定义样式,它会根据其IsMouseOverGotFocus 属性更改其BorderBrush。通用风格来自 mahapps.metro,你可以在这里找到它:https://github.com/MahApps/MahApps.Metro/blob/develop/MahApps.Metro/Styles/Controls.TextBox.xaml

问题是我不能对FakeTextBox 的边框应用相同的行为。我希望在我的自定义 Border 上具有完全相同的行为,以便它看起来与其他 TextBoxes 完全相同。

我已经尝试过但对 Border 不起作用:

  • 绑定到内部TextBoxBorderBrush 属性。
  • 绑定到TextBoxIsFocused 属性:IsFocused 没有设置器。
  • 创建一个隐藏的TextBox 并绑定到它的BorderBrush

是否有通用和/或简单的解决方案?

【问题讨论】:

  • FakeTextBox 派生自TextBox?你也可以显示自定义 TextBox 样式吗?
  • 实际上并非如此。它只是视图/用户控件中的一段代码。这是 TextBox github.com/MahApps/MahApps.Metro/blob/develop/MahApps.Metro/… 的自定义样式。
  • 你能给我们看看构成 FakeTextBox 的代码(xaml 也是)吗?

标签: wpf xaml binding styling mahapps.metro


【解决方案1】:

既然您想复制 Border 行为,让我们在 TextBox Style 中查找 BorderBrushes 以了解它们是如何实现的。找到了三个,要获取他们的密钥,请访问Colors 部分。

<Border BorderThickness="1">
    <Border.Resources>
        <Color x:Key="BlackColor">#FF000000</Color>
        <Color x:Key="Gray2">#FF7F7F7F</Color>
        <Color x:Key="Gray6">#FFCCCCCC</Color>
        <SolidColorBrush x:Key="TextBoxBorderBrush" Color="{StaticResource Gray6}" />
        <SolidColorBrush x:Key="TextBoxMouseOverBorderBrush" Color="{StaticResource Gray2}" />
        <SolidColorBrush x:Key="TextBoxFocusBorderBrush" Color="{StaticResource BlackColor}" />
    </Border.Resources>
    <Border.Style>
        <Style TargetType="{x:Type Border}">
            <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorderBrush}" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="BorderBrush" Value="{StaticResource TextBoxMouseOverBorderBrush}" /> 
                </Trigger>
                <EventTrigger RoutedEvent="Control.GotFocus">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="White" Duration="0:0:0.250"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
    <StackPanel>
        <TextBox BorderThickness="0" />
        <Button>I'm a button inside textbox</Button>
    </StackPanel>
</Border>

IsFocused BorderBrush 很棘手,因为您需要的是 TextBox 的 IsFocused 属性。如果做对了,您可能需要在边框上声明一个 Attached Property IsFocused 并将其绑定到 TextBox 的 IsFocused 或将其全部设为自定义边框。

【讨论】:

  • 谢谢Funk,我想我会走这条路的。只是一个问题也可以与其他主题一起使用:我将 To="White" 更改为 To="{StaticResource BlackColor}" 它不起作用。 BlackColorMahApps 中定义,尽管 :\。有任何想法吗? 编辑:我刚刚意识到这段代码改变了 WPF 视图中每个边框的颜色,即使我只想改变 FakeTextBox 的边框。
  • @U.Bulle 不客气。样式仅应用于外边框。对于适用于所有实例的样式,它必须在资源中声明。您遇到的是颜色的键在 Border.Resources 中被覆盖。你可以把它们一个一个拿出来看看会发生什么。
【解决方案2】:

我遇到过无数问题。

我的解决方案是创建三个不同的边框。

  • FocusBorder
  • MouseOverBorder
  • NormalBorder

FocusBorder 位于顶层,MouseOverBorder 位于中间层,NormalBorder 位于最低层。

FocusBorder 的可见性由Control.GotFocusControl.LostFocus 事件触发器决定。对于 Control.MouseEnterControl.MouseLeave 事件,MouseOverBorder 的行为相同。

<UserControl.Triggers>
        <EventTrigger RoutedEvent="Control.GotFocus">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="FocusBorder"
                                        Storyboard.TargetProperty="Visibility"
                                        Duration="1">
                        <DiscreteObjectKeyFrame KeyTime="0">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>Visible</Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="Control.LostFocus">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="FocusBorder"
                                        Storyboard.TargetProperty="Visibility"
                                        Duration="1">
                        <DiscreteObjectKeyFrame KeyTime="0">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>Collapsed</Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="Control.MouseEnter">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="MouseOverBorder"
                                        Storyboard.TargetProperty="Visibility"
                                        Duration="1">
                        <DiscreteObjectKeyFrame KeyTime="0">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>Visible</Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="Control.MouseLeave">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="MouseOverBorder"
                                        Storyboard.TargetProperty="Visibility"
                                        Duration="1">
                        <DiscreteObjectKeyFrame KeyTime="0">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>Collapsed</Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </UserControl.Triggers>
    <Grid>
        <Border x:Name="FocusBorder" BorderBrush="{DynamicResource ComboBoxMouseOverInnerBorderBrush}"
                Canvas.ZIndex="3" BorderThickness="1" Visibility="Collapsed" />
        <Border x:Name="MouseOverBorder" BorderBrush="{DynamicResource TextBoxMouseOverBorderBrush}"
                Canvas.ZIndex="2" BorderThickness="1" Visibility="Collapsed" />
        <Border BorderBrush="{DynamicResource TextBoxBorderBrush}"
                Canvas.ZIndex="1"  BorderThickness="1" />
        <TextBox BorderThickness="0"></TextBox>
    </Grid>

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多