【问题标题】:Change border Brush WPF更改边框画笔 WPF
【发布时间】:2011-02-12 17:44:32
【问题描述】:

您好,我是 WPF 新手。我使用圆角文本框应用了

<Window.Resources> 

在一些网站上看到不知道是不是最好的。

现在我可能有 4 个文本框都有圆角 我选择了一种边框画笔颜色,并希望它在某个特定的文本框有焦点时改变。所以我添加了事件

private void textBox1_GotFocus(object sender, RoutedEventArgs e)
        {
            textBoxCpanelUserName.BorderBrush = Brushes.OrangeRed;           
        }

但没有效果。我检查了文本框何时具有焦点事件触发但从未更改边框画笔的值。

以下是我的 XMAL

<Window x:Class="AutomatingSomething.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
        Title="MainWindow" Height="600" Width="800" Name="MainContainer" xmlns:my="clr-namespace:WPFControls.Clocks;assembly=WPFControls" xmlns:common="clr-namespace:WPF.Common">
    <Window.Resources>
        <ControlTemplate x:Key="TextBoxBaseControlTemplate" TargetType="{x:Type TextBoxBase}">
            <Border Background="{TemplateBinding Background}" 
                x:Name="Bd" BorderBrush="#FF3BB5C8"
                BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="7">
                <ScrollViewer x:Name="PART_ContentHost"/>                
            </Border>

            <ControlTemplate.Triggers>

                <Trigger Property="Width" Value="Auto">
                    <Setter Property="MinWidth" Value="100"/>
                </Trigger>
                <Trigger Property="Height" Value="Auto">
                    <Setter Property="MinHeight" Value="20"/>
                </Trigger>

            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Window.Resources>
    <Grid Name="MasterGrid">        
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FF484848" Offset="0.075" />
                <GradientStop Color="#FF8A8A8A" Offset="1" />
            </LinearGradientBrush>
        </Grid.Background>
        <Border BorderBrush="Silver" BorderThickness="0" Height="45" HorizontalAlignment="Left" Margin="902,12,0,0" Name="border1" VerticalAlignment="Top" Width="88">
            <my:RetroClock Name="retroClock1" FontSize="28" FontWeight="Normal" />
        </Border>
        <Button Content="Button" Name="button1" Margin="12,25,907,608" Click="button1_Click" />
        <Grid common:VisibilityAnimation.AnimationType="Fade" Height="524" HorizontalAlignment="Left" Margin="101,25,0,0" Name="CpanelSettings" VerticalAlignment="Top" Width="665">
            <Grid.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FFD4D4D4" Offset="0" />
                    <GradientStop Color="#FF797979" Offset="1" />
                </LinearGradientBrush>
            </Grid.Background>
            <Label Content="Cpanel Settings" Height="38" HorizontalAlignment="Left" Margin="289,6,0,0" Name="label1" VerticalAlignment="Top" FontWeight="Bold" FontSize="26" FontFamily="Tekton Pro" FontStretch="Condensed" Width="147">
                <Label.Foreground>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="Black" Offset="0" />
                        <GradientStop Color="#FFB4AFAF" Offset="1" />
                    </LinearGradientBrush>
                </Label.Foreground>
            </Label>
            <TextBox Height="30" HorizontalAlignment="Left" Margin="132,50,0,0" Name="textBoxCpanelUserName" VerticalAlignment="Top" Width="187" FontFamily="Tekton Pro" FontWeight="Bold" BorderThickness="2" Template="{StaticResource TextBoxBaseControlTemplate}" FontSize="15" BorderBrush="#FF3BB5C8" GotFocus="textBox1_GotFocus" />
            <Label Content="Cpanel Settings" FontFamily="Tekton Pro" FontSize="20" FontStretch="Condensed" FontWeight="Bold" Height="34" HorizontalAlignment="Left" Margin="6,46,0,0" Name="label2" VerticalAlignment="Top" Width="120">
                <Label.Foreground>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="Black" Offset="0" />
                        <GradientStop Color="#FFB4AFAF" Offset="1" />
                    </LinearGradientBrush>
                </Label.Foreground>
            </Label>
        </Grid>
    </Grid>
</Window>

我还有一个问题,如果我绘制新文本框并尝试通过绘制的模板使其角落变圆,那么如果我更改焦点上的一个文本框的颜色都会更新?(我不希望这样)


如果我说了任何非技术性的事情或说错了事情,我感到非常抱歉。这是因为我对 wpf 完全陌生


【问题讨论】:

    标签: wpf c#-4.0


    【解决方案1】:

    只需将以下触发器添加到 ControlTemplate.Triggers

    <Trigger Property="IsFocused" Value="true">
         <Setter Property="BorderBrush" TargetName="Bd" Value="Red"/>
    </Trigger>
    

    【讨论】:

      【解决方案2】:

      我想你忘记在 TextBoxBaseControlTemplate 中绑定 Bd 的 BorderBrush,因为你为 Background 制作了它。

      模板应如下所示:

      <ControlTemplate x:Key="TextBoxBaseControlTemplate" TargetType="{x:Type TextBoxBase}">
          <Setter Property="BorderBrush" Value="#FF3BB5C8"/>
          <Border Background="{TemplateBinding Background}" 
                  x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}"
                  BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="7">
              <ScrollViewer x:Name="PART_ContentHost"/>                
           </Border>
      ...
      

      【讨论】:

      • 实际上我是从某人的网站上复制的。是的,我认为它是用于背景的,但是当我在这里更改边框画笔时,它会被更改
      • 关于你的第二个问题。模板作为每个元素的可视化树的工厂。这意味着每个 TextBox 都有自己的模板表示,因此如果您更改一个 TextBox 的颜色,这对另一个 TextBox 没有影响(因为它们只共享工厂,而不是实际元素)。