C# 在其他网格上淡入的WPF网格具有非活动控件
我在为C WPF应用程序开发的UI中遇到一些意外行为 cliffnotes的版本是,我有3个网格,它们都位于表单上的同一区域。基于某些切换按钮,这些网格被启用或禁用,并淡入和淡出视图。然而,似乎在某些情况下,某些文本框可以使用,而另一些则不能 以下是我正在应用的样式:C# 在其他网格上淡入的WPF网格具有非活动控件,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我在为C WPF应用程序开发的UI中遇到一些意外行为 cliffnotes的版本是,我有3个网格,它们都位于表单上的同一区域。基于某些切换按钮,这些网格被启用或禁用,并淡入和淡出视图。然而,似乎在某些情况下,某些文本框可以使用,而另一些则不能 以下是我正在应用的样式: <!-- Fade in/out style for grid --> <Style x:Key="FadeInOutStyle" TargetType="Grid
<!-- Fade in/out style for grid -->
<Style
x:Key="FadeInOutStyle"
TargetType="Grid">
<Style.Triggers>
<Trigger
Property="IsEnabled"
Value="True">
<Trigger.Setters>
<Setter
Property="Panel.ZIndex"
Value="1"/>
</Trigger.Setters>
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0.0"
To="1.0"
Duration="0:0:0.8"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="1.0"
To="0.0"
Duration="0:0:0.4"/>
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
<Trigger
Property="IsEnabled"
Value="False">
<Trigger.Setters>
<Setter
Property="Panel.ZIndex"
Value="0"/>
</Trigger.Setters>
</Trigger>
</Style.Triggers>
这是其中一个网格的XAML。它们都只有标签和文本框控件。它们都以相同的边距和类似的调光开始:
<Grid
Name="IndividualGrid"
IsEnabled="False"
Height="30"
Width="420"
Opacity="0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="10,90,0,0"
Style="{StaticResource FadeInOutStyle}"
Panel.ZIndex="0">
<Label
Content="First Name"
Height="25"
Width="90"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Margin="0,0,0,0"/>
<TextBox
Name="SubjFirstNameBox"
Height="30"
Width="100"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Style="{StaticResource ValidationStyle}"
Margin="100,0,0,0">
<TextBox.Text>
<Binding
Path="SubjFirstName"
Mode="TwoWay">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<Label
Content="Last Name"
Height="25"
Width="90"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Margin="210,0,0,0"/>
<TextBox
Name="SubjLastNameBox"
Height="30"
Width="100"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Style="{StaticResource ValidationStyle}"
Margin="310,0,0,0">
<TextBox.Text>
<Binding
Path="SubjLastName"
Mode="TwoWay">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</Grid>
有人知道我在搞什么吗?我假设它必须是堆叠的网格,所以如果有人有更好的方法,我很乐意听到。我很确定我以前也这样做过,我想禁用和设置面板索引就可以了。所以,在深入了解之后,我现在发现了以下几点,在我的脑海中可能会导致这个错误
<TextBox Name="SubjLastNameBox" Height="30" Width="100" VerticalAlignment="Top" HorizontalAlignment="Left" Style="{StaticResource ValidationStyle}" Margin="310,0,0,0">
<TextBox.Text>
<Binding Path="SubjLastName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
编辑:
另一个解决方案可能是:
<Trigger Property="IsEnabled" Value="False">
<Trigger.Setters>
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger.Setters>
</Trigger>
<Trigger Property="IsEnabled" Value="true">
<Trigger.Setters>
<Setter Property="Visibility" Value="Visible"/>
</Trigger.Setters>
</Trigger>
在这里,我使用Property=Visibility而不是Property=Panel.ZIndex,因此如果未使用整个控件,则隐藏该控件;如果已使用,则显示该控件。你必须调整它一点,因为你想显示淡入淡出?如果是这样,在开始淡入之前,您需要将其恢复为可见状态。你也必须在淡出后折叠它
希望这能解决您的问题。到目前为止,我在第一个视图中看到,您没有使用System.ComponentModel继承INotifyPropertyChanged并添加公共事件属性ChangedEventHandler属性Changed;///通知UI进行更改///private void OnPropertyChangedstring propertyName{if PropertyChanged!=null{PropertyChangedthis,new PropertyChangedEventArgspropertyName;}}此外,您还需要向setter添加例如OnPropertyChangedSubjLastName。实际上,我需要在视图模型中继承INotifyPropertyChanged,但目前这不会影响其他字段。我现在正在设计UI。我也看到了与遗漏相关的错误,在这种情况下,它不会导致我的问题。你能细化你所说的“某些文本框可以使用,而其他文本框不能使用”的意思吗?它们是否完全不起作用/不接受输入,或者绑定有什么问题,或者…?当然。鼠标悬停时,鼠标光标不会变成文本光标,我无法单击该字段以将键盘焦点转移到该字段。该字段也可以是图片而不是文本框。下面选择回答的限定符-答案在注释中。关键是要抓住可视性,而不是试图使用iEnabled。我会在回去报告时试一试。这个问题不是间歇性的,也不会影响表单上的其他textbox控件,只是我有多个网格重叠的堆叠控件。我添加了另一个基于触发器的解决方案,在示例触发器中,我使用Visibility而不是Panel.ZIndex这可能会带来预期的效果。Visibility成功了。我发誓我以前也这么做过,但这次没有。谢谢你的建议。
<TextBox Name="SubjLastNameBox" Height="30" Width="100" VerticalAlignment="Top" HorizontalAlignment="Left" Style="{StaticResource ValidationStyle}" Margin="310,0,0,0">
<TextBox.Text>
<Binding Path="SubjLastName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
//using System.ComponentModel;
public class MyClass : INotifyPropertyChanged
{
private string _subjLastName;
///<summary>
/// public lastname property
///</summary>
public string SubjLastName
{
get
{
return _subjLastName;
}
set
{
// The if statement here is importent! So you only raise the notification if the value has changed
if (_subjLastName != value)
{
_subjLastName = value;
OnPropertyChanged("SubjLastName");
}
}
}
#region INotify
#region OnPropertyChanged + Handler
///<summary>
/// PropertyChanged event handler
///</summary>
public event PropertyChangedEventHandler PropertyChanged;
///<summary>
/// Notify the UI for changes
///</summary>
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
#endregion
}
<Trigger Property="IsEnabled" Value="False">
<Trigger.Setters>
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger.Setters>
</Trigger>
<Trigger Property="IsEnabled" Value="true">
<Trigger.Setters>
<Setter Property="Visibility" Value="Visible"/>
</Trigger.Setters>
</Trigger>