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:除非为样式创建了控件模板,否则控件样式不起作用_Wpf_Textbox_Styles_Controltemplate - Fatal编程技术网

WPF:除非为样式创建了控件模板,否则控件样式不起作用

WPF:除非为样式创建了控件模板,否则控件样式不起作用,wpf,textbox,styles,controltemplate,Wpf,Textbox,Styles,Controltemplate,这几天几乎让我发疯。我在xaml文件中有一个文本框和样式。 但是没有控件模板的样式无法在textbox上生效。然而,一个控件模板可以工作,但是控件模板似乎完全覆盖了文本框,文本框的默认行为,如编辑、输入或选择。。。 以下是带有控制模板的xaml的内容: <Style TargetType="{x:Type TextBox}"> <Setter Property="Template"> <Setter.Value>

这几天几乎让我发疯。我在xaml文件中有一个文本框和样式。 但是没有控件模板的样式无法在textbox上生效。然而,一个控件模板可以工作,但是控件模板似乎完全覆盖了文本框,文本框的默认行为,如编辑、输入或选择。。。 以下是带有控制模板的xaml的内容:

   <Style TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border Name="tbBorder"  Background="White"  BorderThickness="0.6" BorderBrush="#B9B9B9">
                        <ContentPresenter/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsFocused" Value="true">
                            <Setter Property="BorderBrush" Value="#4D90FE" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="BorderBrush" Value="#4D90FE" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

这是一种根本不起作用的简单风格

    <Style TargetType="{x:Type TextBox}">
       <Style.Triggers>
            <Trigger Property="IsFocused" Value="true">
                <Setter Property="BorderBrush" Value="#4D90FE" />
            </Trigger>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="BorderBrush" Value="#4D90FE" />
            </Trigger>
        </Style.Triggers>
    </Style>

谢谢

更新:整个文本框的代码片段:

       <TextBox Height="23" HorizontalAlignment="Left" Margin="114,53,0,0" Name="textBox1" VerticalAlignment="Top" Width="150" Text="{Binding Path=TraderAccount, Mode=OneWayToSource, NotifyOnValidationError=True}" BorderBrush="#FFB9B9B9" BorderThickness="1" >
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                        <Trigger Property="IsFocused" Value="true">
                            <Setter Property="BorderBrush" Value="Red" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="BorderBrush" Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>

您没有发布
文本框
代码,但我认为(我也遇到过这种情况),您只是忘记设置
文本框的
边框厚度

<TextBox BorderThickness="4">
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="IsFocused" Value="true">
                        <Setter Property="BorderBrush" Value="#4D90FE" />
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="BorderBrush" Value="#4D90FE" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

您没有发布
文本框
代码,但我认为(我也遇到过这种情况),您只是忘记设置
文本框的
边框厚度

<TextBox BorderThickness="4">
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="IsFocused" Value="true">
                        <Setter Property="BorderBrush" Value="#4D90FE" />
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="BorderBrush" Value="#4D90FE" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

样式设置器为我工作,但我看到的问题是,控件动画正在设置刚设置的样式的动画

您可能希望提取原始控件模板并重新定义它,而不是完全重新定义它。据我所知,textbox控件不仅仅是一个带有内容展示器的边框(尽管我从未为它提取过控件模板!),而且它可能有两个边框,可以为它提供所有状态等

可以使用Blend执行此操作-如果没有Blend,则可以使用MSDN资源来创建控件模板和样式:

编辑:

首先,在我看来,您缺少重新定义的模板中的内容“部分”

<ScrollViewer Margin="0" x:Name="PART_ContentHost" />

编辑2:

你是说它不起作用。。。这对我使用.NET Framework 4.0在WPF上的工作非常有效-我将边框颜色改为“红色”,以确保我可以看到效果,并且它肯定有效,除了红色会立即褪色之外,因为控件的视觉状态由视觉状态管理器更改(这就是为什么需要编辑控件模板并更改视觉状态)


当您将鼠标悬停在长方体上时,会得到一个红色边框,该边框会立即淡出


这个XAML对你根本不起作用吗?

样式设置器对我起作用,但我看到的问题是,控件动画正在动画化刚刚设置的样式

您可能希望提取原始控件模板并重新定义它,而不是完全重新定义它。据我所知,textbox控件不仅仅是一个带有内容展示器的边框(尽管我从未为它提取过控件模板!),而且它可能有两个边框,可以为它提供所有状态等

可以使用Blend执行此操作-如果没有Blend,则可以使用MSDN资源来创建控件模板和样式:

编辑:

首先,在我看来,您缺少重新定义的模板中的内容“部分”

<ScrollViewer Margin="0" x:Name="PART_ContentHost" />

编辑2:

你是说它不起作用。。。这对我使用.NET Framework 4.0在WPF上的工作非常有效-我将边框颜色改为“红色”,以确保我可以看到效果,并且它肯定有效,除了红色会立即褪色之外,因为控件的视觉状态由视觉状态管理器更改(这就是为什么需要编辑控件模板并更改视觉状态)


当您将鼠标悬停在长方体上时,会得到一个红色边框,该边框会立即淡出


这个XAML对您根本不起作用吗?

您的样式确实起作用,在没有模板的样式中设置一个属性,如
Background
,您将看到它确实得到了应用。但是,与前面提到的其他人一样,您没有看到任何更改的原因是
TextBox
的默认WPF控件模板中存在动画(动画值始终优先于本地值、设置器和触发器)。当您重新定义控件模板时,这些动画不再存在,因此您的示例可以正常工作。您可以使用默认的
TextBox
模板,并根据您的目的对其进行修改(可在此处找到:)

您的样式确实有效,在没有模板的样式中设置一个属性,如
Background
,您将看到它确实得到了应用。但是,李