2015-04-22 49 views
1

我遇到了一些意外的行爲,我正在爲C#WPF應用程序工作。在其他網格上褪色的WPF網格具有非活動控件

懸崖版本是我有3個網格,所有「居住」在窗體上的同一區域。基於一些切換按鈕,這些網格被啓用或禁用並淡入和淡出。但是,似乎在某些情況下可以使用某些文本框,而其他文件夾則不能使用。

這裏是我申請的樣式:

<!-- 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> 

的風格似乎適用就好,網格淡入和淡出視野預期。以下是其中一個「已檢查」功能,可以啓用已檢查的網格並禁用其他網格。如果你想看到其他人只是這麼說,但是這將是一個比特犬和小馬顯示:

private void IndividualRadio_Checked(object sender, RoutedEventArgs e) 
    { 
     this.TwoIndividualGrid.IsEnabled = false; 
     this.CommercialGrid.IsEnabled = false; 
     this.IndividualGrid.IsEnabled = true; 
    } 

這裏是XAML的電網之一。它們都只有標籤和TextBox控件。他們一開始都是用相同的利潤率和類似dimmensions:

 <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> 

而且,只是因爲我知道有人可能會問,看看吧,這裏有我綁定屬性的幾個例子。在這種情況下,第一名稱/ SubjFirstName文本框不工作,但姓氏/ SubjLastName文本框的作用:

private string subjFirstName; 
    public string SubjFirstName 
    { 
     get { return subjFirstName; } 
     set { subjFirstName = value; } 
    } 

    private string subjLastName; 
    public string SubjLastName 
    { 
     get { return subjLastName; } 
     set { subjLastName = value; } 
    } 

因此,沒有人看到我在這裏搞亂?我假設它必須是堆疊的網格,所以如果有人有更好的方法,我很樂意聽到它。我相當肯定我以前就是這樣做的,而且我認爲禁用和設置面板索引是可以做到的。

+0

到目前爲止,我可以在第一個視圖中看到,您錯過了繼承'INotifyPropertyChanged'('System using。ComponentModel')並添加'public event PropertyChangedEventHandler PropertyChanged; ///

///通知更改的UI /// 私人無效OnPropertyChanged(字符串propertyName的) { 如果(的PropertyChanged!= NULL){ 的PropertyChanged(這一點,新PropertyChangedEventArgs(propertyName的) ); } }'也是你需要添加例如'OnPropertyChanged(「SubjLastName」)'給設置者。 – k1ll3r8e

+0

我其實需要在我的視圖模型中繼承INotifyPropertyChanged,但是暫時不影響其他字段。我現在只是設計用戶界面。我也看到了與錯過相關的錯誤,在這種情況下它不會導致我的問題。 – MattB

+0

當你說'某些文本框可以被使用而其他人不能'時,你可以改進你的意思嗎?他們完全沒有功能/不接受投入,或者與綁定有什麼不妥之處,或者......? – goobering

回答

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" UpdateSourceTrigger="PropertyChanged"> 
     <Binding.ValidationRules> 
      <ExceptionValidationRule/> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox.Text> 

正如你可以看到我添加UpdateSourceTrigger="PropertyChanged"如果使用Mode="TwoWay"這是非常重要的。另外,正如我的評論中所述,您需要將INotifyPropertyChanged添加到您的視圖模型中。

//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> 

這裏我用Property="Visibility"而不是Property="Panel.ZIndex"所以你隱藏的完全控制,如果它不使用或您展示它,如果它的使用。 (你需要調整一下,因爲你想要顯示淡入淡出?如果是這樣,你需要把它帶回Visible,然後你纔開始淡入淡出。你也可以在淡出之後輸入Collapse。)

希望這會解決您的問題。

+0

當我回來並報告時,我會給它一個鏡頭。此問題不是間歇性的,並且不會影響表單上的其他文本框控件,只是堆疊的,我有多個網格重疊。 – MattB

+0

我添加了另一個基於'Trigger'的解決方案,在示例'Trigger'中我使用'Visibility'而不是'Panel.ZIndex',這可能會帶來希望的效果。 – k1ll3r8e

+1

可見度有訣竅。我發誓我之前用'IsEnabled'完成了這個,但這次沒有骰子。感謝您的建議。 – MattB