Wpf 将TextBox的BorderBrush动态应用于边框的BorderBrush
我的应用程序中有Wpf 将TextBox的BorderBrush动态应用于边框的BorderBrush,wpf,xaml,binding,styling,mahapps.metro,Wpf,Xaml,Binding,Styling,Mahapps.metro,我的应用程序中有textboxs和FakeTextBoxesfaketextbox充当textbox,但它们有更多的功能,因为它们里面有按钮和/或图像XAML用于FakeTextBox的外观如下: <Border BorderThickness="1"> <StackPanel Orientation="Horizontal"> <TextBox
textboxs
和FakeTextBoxes
faketextbox
充当textbox
,但它们有更多的功能,因为它们里面有按钮和/或图像XAML
用于FakeTextBox
的外观如下:
<Border BorderThickness="1">
<StackPanel Orientation="Horizontal">
<TextBox BorderThickness="0" />
<Button>I'm a button inside textbox</Button>
</StackPanel>
</Border>
我是文本框中的一个按钮
我的项目中的TextBox
具有自定义样式,可根据其IsMouseOver
和GotFocus
属性更改其BorderBrush
。通用样式来自mahapps.metro,您可以在此处找到:
问题是我不能对我的FakeTextBox
的边框应用相同的行为。我希望在我的自定义边框上具有完全相同的行为,以便它看起来与其他文本框
完全相同
我在Border
中尝试过但没有成功的内容:
- 绑定到内部
文本框的BorderBrush
属性
- 绑定到
TextBox
的IsFocused
属性:IsFocused没有setter
- 创建隐藏的
文本框
并绑定到其边框笔刷
有一个通用和/或简单的解决方案吗?既然您想复制边界行为,让我们在en中查找边界笔刷的实现方式。找到三个,去拿钥匙,去参观一下
#FF000000
#FF7F7F
#FFCCCC
我是文本框中的一个按钮
IsFocused BorderBrush很棘手,因为它是文本框的IsFocused属性。如果做得好,您可能希望在边框上声明一个IsFocused,并将其绑定到文本框的IsFocused,或者将其全部设置为自定义边框。我在这方面遇到了无数问题
我的解决方案是创建三个不同的边界
FocusBorder
MouseOverBorder
NormalBorder
<代码> FocusBorder <代码>停留在顶部,<代码> MouseOverBorder <代码>停留在中间层,<代码> NormalBorder <代码>在最低级。
FocusBorder
的可见性由Control.GotFocus
和Control.LostFocus
事件触发器决定。对于Control.MouseEnter
和Control.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>
看得见的
崩溃
看得见的
崩溃
FakeTextBox
是否源自文本框
?你也可以显示自定义文本框样式吗?实际上不是。它只是视图/用户控件中的一个代码段。这是文本框的自定义样式。你能给我们看一下组成FaketTextBox的代码(xaml)吗?谢谢你,芬克,我想我会选择这种方式。只是一个问题:我将改为=“白色”
改为改为=“{StaticResource BlackColor}”
它不起作用BlackColor
在MahApps
中定义,但:\。有什么想法吗?编辑:我刚刚意识到,这段代码会更改WPF视图中每个边框的颜色,尽管我只想更改FakeTextBox
@U.Bulle的边框。该样式仅应用于外部边界。对于要应用于所有实例的样式,必须在参考资料中声明它。您所经历的是,Border.Resources中的颜色键被覆盖。你可以一个接一个地把它们拿出来,看看会发生什么。
<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>