Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 将TextBox的BorderBrush动态应用于边框的BorderBrush_Wpf_Xaml_Binding_Styling_Mahapps.metro - Fatal编程技术网

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>