我有一個簡單的視窗,Grid其中有一個TextBox. 我設定IsEnabled了Gridto False。
<Grid IsEnabled="False">
<TextBox Text="Foo"/>
<TextBlock Text = "Bar"/>
<TextBox Text="Bazz" Foreground ="Orange"/>
</Grid>
XAML 設計器顯示所有三個元素現在都顯示為灰色以回應IsEnabled = false,如果我除錯,所有三個元素中的文本在應用程式中都是灰色的。我想將灰色前景狀態的值控制為更暗的值。
由于三個內部控制元件在禁用時保留其顏色,因此 WPF 似乎通過不透明度更改傳達“禁用”。我在哪里/如何覆寫它?如果 XAML 設計器顯示所需的較暗文本,那就太好了。
uj5u.com熱心網友回復:
實際上,a 的默認樣式TextBox設定了較低的不透明度。
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Opacity" TargetName="border" Value="0.56"/>
</Trigger>
為了改變這一點,您必須創建自己的TextBox樣式或復制默認樣式及其控制模板,例如使用 Visual Studio 或 Blend。從那里,通過將設定器添加到上面顯示的觸發器來自定義禁用狀態。
<SolidColorBrush x:Key="TextBox.Static.Border" Color="#FFABAdB3"/>
<SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="#FF7EB4EA"/>
<SolidColorBrush x:Key="TextBox.Focus.Border" Color="#FF569DE5"/>
<Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="{StaticResource TextBox.Static.Border}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="AllowDrop" Value="true"/>
<Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
<ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<!-- ...add or change setters here. -->
<Setter Property="Opacity" TargetName="border" Value="0.56"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.Focus.Border}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsInactiveSelectionHighlightEnabled" Value="true"/>
<Condition Property="IsSelectionActive" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="SelectionBrush" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
</MultiTrigger>
</Style.Triggers>
</Style>
例如,此觸發器將前景色設定為紅色,不透明度為一半。
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Opacity" TargetName="border" Value="0.5"/>
<Setter Property="Foreground" Value="Red"/>
</Trigger>
TextBox然后,在es中參考你要應用的樣式。
<Grid IsEnabled="False">
<TextBox Style="{StaticResource TextBoxStyle}" Text="Foo"/>
<TextBlock Style="{StaticResource TextBlockStyle}" Text = "Bar"/>
<TextBox Style="{StaticResource TextBoxStyle}" Text="Bazz" Foreground ="Orange"/>
</Grid>
如果您想自動將樣式應用于TextBox您創建樣式的資源范圍內的所有 es,請將其洗掉x:Key以使其隱式并且不要設定或參考樣式。
<Style TargetType="{x:Type TextBox}">
<Grid IsEnabled="False">
<TextBox Text="Foo"/>
<TextBlock Text = "Bar"/>
<TextBox Text="Bazz" Foreground ="Orange"/>
</Grid>
默認TextBlock樣式對于禁用狀態沒有特殊外觀。TextBox您可以將其與樣式類似地進行調整。這是一個例子。
<Style TargetType="{x:Type TextBlock}">
<Setter Property="TextWrapping" Value="NoWrap"/>
<Setter Property="TextTrimming" Value="None"/>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/472177.html
下一篇:WPF如何訪問嵌套網格?
