如何在app.xaml [C#]中全局设置文本框的属性

时间:2016-04-26 20:51:03

标签: c# wpf xaml

我正在编写一个应用程序而且我有所有逻辑,但是从前端的角度来看有一些我不太熟悉的工作。

我已经学会了如何设置所有按钮的全局设计。我试图做文本框的方式相同。确实应用了样式但是在应用此样式后我无法在文本框中插入任何文本... 我该怎么办呢?问题是什么 ?可能有人建议我出了什么问题吗?

我想要做的只是在所有文本框和按钮周围制作红色细边框,而有人将鼠标放在它们上面。还有一个组合框,我也希望以同样的方式提供服务。

这是我在App.xaml中的代码:

<Application x:Class="Application.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Application"
             StartupUri="MainWindow.xaml">
    <Application.Resources>

        <Style TargetType="Button">
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" 
                            CornerRadius="2"
                            BorderThickness="2"
                            BorderBrush="{TemplateBinding BorderBrush}"  
                            Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="border" Property="BorderBrush" Value="#FF0000" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style TargetType="TextBox">
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <!--<Setter Property="Foreground" Value="#000000"/>-->
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TextBox">
                        <Border Name="textbox" 
                            CornerRadius="2"
                            BorderThickness="2"
                            BorderBrush="{TemplateBinding BorderBrush}"  
                            Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="textbox" Property="BorderBrush" Value="#FF0000" />
                                <!--<Setter Property="Foreground" Value="#FF0000"/>-->
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    </Application.Resources>
</Application>

编辑:按钮按钮正常工作

!!!编辑2:

我试图在我的路上修复组合框,但是任何与ControlTemplate的组合都没有ScrollViewer取得成功。这是我的应用程序中唯一缺少的一个组件。我已阅读并尝试了许多解决方案,例如:How to style ComboBox Background on Mouse Hover?

因此,我想取悦解决方案。因为我专注于编程的逻辑部分,所以对xaml的更复杂部分的全部理解对于我仅仅是一个组合框的突出显示并不重要。 我希望有一个组合框可以改变颜色边框,而鼠标结束时红色,其余的组合框应保持标准。就是这一个属性。我怎么可以快速改变它?

1 个答案:

答案 0 :(得分:3)

TextBox期望名称为“PART_ContentHost”的控件可以放置它的内容。实际上在TextBox的默认模板中使用了ScrollViewer,因此解决的一种方法是将ContentPresenter替换为:

<ScrollViewer x:Name="PART_ContentHost" />

或者,您可以将边框用作内容主持人:

<ControlTemplate TargetType="TextBox">
     <Border CornerRadius="2"
             BorderThickness="2"
             BorderBrush="{TemplateBinding BorderBrush}"
             Background="{TemplateBinding Background}"
             x:Name="PART_ContentHost" />
          <ControlTemplate.Triggers>
              <Trigger Property="IsMouseOver" Value="True">
                  <Setter TargetName="PART_ContentHost"
                          Property="BorderBrush"
                          Value="#FF0000" />
              </Trigger>
          </ControlTemplate.Triggers>
</ControlTemplate>

更新:为什么PART_ContentHost?假设您是某些控件的作者。您尝试设计控件,以便它可以与其他人提供的任何ControlTemplate一起使用。但这并非总是可行,有时您需要模板的特定部分来匹配特定条件。在这种情况下,TextBox的作者在其模板中找到一个控件,该控件是ScrollViewer或Decorator,并且名称为“PART_ContentHost”。他后来对该控件的作用与我们无关:TextBox只需要名称为“PART_ContentHost”的控件在模板中以便正常运行。控制作者如何表达这样的要求?通过TemplatePart属性。除了表达上述要求之外,此属性不执行任何操作。如果您查看TextBox继承的TextBoxBase控件,您将看到:

[TemplatePart(Name = "PART_ContentHost", Type = typeof (FrameworkElement))]