C# 父控件未启用WPF选项卡
我正在开发一个WPF应用程序,它(主要)使用MVVM。我的问题是我有一个选项卡控件(实际上是一个嵌套的选项卡控件),它的行为很奇怪。父控件在长时间的后台处理过程中被禁用(这是我想要的行为!),但是当后台工作完成并且父控件自身重新启用时,其中一个嵌套选项卡保持禁用状态。并且,根据在后台操作之前选择的选项卡,违规选项卡会发生变化;有时第二个选项卡将保持禁用状态,有时第三个选项卡将保持禁用状态 我实际上并没有通过数据绑定或代码隐藏来触及单个选项卡的“IsEnabled”属性。只有父控件(重要时为网格)被禁用 我很感激任何调试这个的策略;什么原因会导致一个标签与其他标签区别对待 实际上,重现问题并不需要后台处理。也可以通过在代码隐藏中简单地禁用和重新启用父网格来实现:C# 父控件未启用WPF选项卡,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在开发一个WPF应用程序,它(主要)使用MVVM。我的问题是我有一个选项卡控件(实际上是一个嵌套的选项卡控件),它的行为很奇怪。父控件在长时间的后台处理过程中被禁用(这是我想要的行为!),但是当后台工作完成并且父控件自身重新启用时,其中一个嵌套选项卡保持禁用状态。并且,根据在后台操作之前选择的选项卡,违规选项卡会发生变化;有时第二个选项卡将保持禁用状态,有时第三个选项卡将保持禁用状态 我实际上并没有通过数据绑定或代码隐藏来触及单个选项卡的“IsEnabled”属性。只有父控件(重要时为网格)
private void test1_Click(object sender, RoutedEventArgs e)
{
myGrid.IsEnabled = false;
}
private void test2_Click(object sender, RoutedEventArgs e)
{
myGrid.IsEnabled = true;
}
编辑:我可能已经将问题缩小到以下样式。如果我通过添加一个键来临时禁用样式,那么问题就会消失;但是,我当然希望保持我的选项卡的视觉外观:
<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid Height="{Binding Path=HeaderHeight, ElementName=uc}" VerticalAlignment="Bottom">
<Border Name="Border"
Background="{StaticResource TabItem_BackgroundBrush_Unselected}"
BorderBrush="{StaticResource TabItem_BorderBrush_Selected}"
Margin="{StaticResource TabItemMargin_Selected}"
BorderThickness="2,1,1,0"
CornerRadius="3,3,0,0"
>
<Border BorderBrush="{StaticResource TabItem_BorderBrush_Selected}"
BorderThickness="0,0,0,1"
Margin="0"
Name="BottomBorder"
>
<ContentPresenter x:Name="ContentSite"
VerticalAlignment="Center"
HorizontalAlignment="Center"
ContentSource="Header"
Margin="7,2,12,2"
RecognizesAccessKey="True"
/>
</Border>
</Border>
</Grid>
<ControlTemplate.Triggers>
<!-- TabItem appearance when NOT selected -->
<Trigger Property="IsSelected" Value="False">
<Setter Property="Panel.ZIndex" Value="90" />
<Setter TargetName="Border" Property="BorderBrush"
Value="{StaticResource TabItem_Border_Unselected}" />
<Setter Property="Foreground"
Value="{StaticResource TabItem_TextBrush_Unselected}" />
<Setter TargetName="Border" Property="Margin"
Value="{StaticResource TabItemMargin_Base}" />
</Trigger>
<!-- TabItem appearance when disabled -->
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Panel.ZIndex" Value="80" />
<Setter TargetName="Border" Property="BorderBrush"
Value="{StaticResource TabItem_DisabledBorderBrush}" />
<Setter TargetName="Border" Property="Background"
Value="{StaticResource TabItem_BackgroundBrush_Disabled}" />
<Setter Property="Foreground"
Value="{StaticResource TabItem_TextBrush_Disabled}" />
</Trigger>
<!-- TabItem appearance when hovering -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Border.IsMouseOver" Value="True" />
<Condition Property="IsSelected" Value="False" />
</MultiTrigger.Conditions>
<Setter Property="Panel.ZIndex" Value="99" />
<Setter Property="Foreground" Value="{StaticResource TabItem_TextBrush_Hover}" />
<Setter TargetName="Border" Property="BorderBrush"
Value="{StaticResource TabItem_HoverBorderBrush}" />
<Setter TargetName="Border" Property="BorderThickness"
Value="2,1,1,1" />
<Setter TargetName="BottomBorder" Property="BorderThickness"
Value="0,0,0,0" />
<Setter TargetName="Border" Property="Background"
Value="{StaticResource TabItem_HoverBackgroundBrush}" />
<Setter TargetName="Border" Property="Margin"
Value="{StaticResource TabItemMargin_Hover}" />
</MultiTrigger>
<!-- TabItem appearance when active/selected -->
<Trigger Property="IsSelected" Value="True">
<Setter Property="Panel.ZIndex" Value="100" />
<Setter TargetName="Border" Property="BorderBrush"
Value="{StaticResource TabItem_BorderBrush_Selected}" />
<Setter TargetName="Border" Property="Background"
Value="{StaticResource TabItem_BackgroundBrush_Selected}" />
<Setter TargetName="BottomBorder" Property="BorderThickness"
Value="0,0,0,0" />
<Setter TargetName="Border" Property="BorderThickness"
Value="1,1,1,0" />
<Setter Property="Foreground" Value="{StaticResource TabItem_TextBrush_Selected}" />
<Setter TargetName="Border" Property="Margin"
Value="{StaticResource TabItemMargin_Selected}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
肯定需要查看定义控件的实际xaml是否始终禁用未选中的选项卡项?或者只是其中的一个3,不管选择了哪一个?它只是其中的一个。保持禁用状态的选项卡似乎是所选选项卡左侧的任何选项卡(如果选择了第一个选项卡,则最后一个选项卡保持禁用状态)。我认为问题源于多个触发器更改相同属性的事实。最终值现在取决于属性的更改顺序。尝试多重跳跳虎或设置不同的属性(例如颜色和不透明度),你看起来是正确的:触发器。如果我完全移除它们,那么选项卡开始正常工作(但看起来完全错误:)。不过,我第一次尝试使用多触发程序并没有解决这个问题;我尝试将IsEnabled=true添加到非禁用状态。看起来这需要一些实验来找到正确的属性组合。