gpt4 book ai didi

wpf ContentPresenter 不会启用/禁用

转载 作者:行者123 更新时间:2023-12-03 10:31:00 25 4
gpt4 key购买 nike

我已经覆盖了 ComboBox为了在组合的末尾添加一个额外的按钮 - 我正在使用它来帮助浏览我的应用程序。

它是一个 M-V-VM 应用程序,具有编辑-保存/取消机制,可根据用户是否处于“编辑模式”来禁用或启用控件。无论 View 是启用还是禁用,我都希望我的导航按钮始终可用。

为了实现这一点,我绑定(bind)了 ToggleButtonContentPresenterIsEditable我的模型上的属性。

切换按钮按预期启用和禁用,但组合的文本保持启用状态。

由于文本由 ContentPresenter 提供和 ContentPresenter有一个 IsEnabled属性我不明白为什么它不会禁用?

有人可以帮忙吗?谢谢安迪

<Style TargetType="local:EntityCombo">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
<Setter Property="MinWidth" Value="120"/>
<Setter Property="MinHeight" Value="20"/>
<Setter Property="FontSize" Value="12" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:EntityCombo" >
<Grid>
<ToggleButton
IsEnabled="{Binding IsEditable}"
Name="ToggleButton"
Template="{DynamicResource ComboBoxToggleButton}"
Grid.Column="2"
Focusable="false"
IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press">
</ToggleButton>
<Button Grid.Column="2" Style="{DynamicResource EntitySelectedButton}" Command="{TemplateBinding EntitySelected}" CommandParameter="{TemplateBinding SelectedItem}"></Button>
<ContentPresenter
IsEnabled="{Binding IsEditable}"
Name="ContentSite"
IsHitTestVisible="False"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{DynamicResource SelectionBoxItem}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
Margin="3,3,23,3"
VerticalAlignment="Center"
HorizontalAlignment="Left" />
<Popup
Name="Popup"
Placement="Bottom"
IsOpen="{TemplateBinding IsDropDownOpen}"
AllowsTransparency="True"
Focusable="False"
PopupAnimation="Slide">
<Grid
Name="DropDown"
SnapsToDevicePixels="True"
MinWidth="{TemplateBinding ActualWidth}"
MaxHeight="{TemplateBinding MaxDropDownHeight}">
<Border
x:Name="DropDownBorder"
Background="{StaticResource WindowBackgroundBrush}"
BorderThickness="1"
BorderBrush="{StaticResource SolidBorderBrush}"/>
<ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
</ScrollViewer>
</Grid>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasItems" Value="false">
<Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="DarkGray"/>
</Trigger>

<Trigger Property="IsEnabled" Value="true">
<Setter Property="Foreground" Value="Red"/>

</Trigger>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</Trigger>
<Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
<Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
<Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
</Trigger>

</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
</Style.Triggers>
</Style>

最佳答案

这是一个棘手的问题,但我已经在 WPF 中深入研究了足够长的时间来非常坚持。 :)
在我上一条评论中提出这个建议后,我的精神错乱驱使我进行测试,这确实是问题所在:

模板集ComboBox.Foreground基于 ComboBox.IsEnabled ,但您希望根据 DataContext.IsEnabled 设置内容样式,因此您需要设置 ContentPresenter 的样式本身。但是你不能设置 ContentPresenter因为它继承自 FrameworkElement ,而不是控制。但是您可以替换 ContentPresenterContentControl并使用适当的触发器为您的禁用外观设置样式。

关于wpf ContentPresenter 不会启用/禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1272277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com