2011-08-26 33 views
1

我的表單上的某些複選框不應該能夠被用戶選中/取消選中。有沒有辦法讓我在Checbox的Check事件觸發前取消事件?是否有預檢WPF複選框?

中的WinForms

它很容易,只是

public void cb_BeforeChecked(object sender, EventArgs e){ 
    e.Handled = true; 
} 

,但我不能找到這樣的WPF什麼...我想你也許可以做到這一點,就需要做一些花哨..

謝謝!

+8

爲什麼不只是設置'IsReadOnly =「True」'? – Rachel

+0

如果我可以選擇你的評論作爲答案,我會!除了複選框沒有IsReadOnly屬性,所以我使用了IsEnabled,它的效果更好,因爲如果它沒有被啓用,它就會使框變灰。謝謝! – Toadums

+0

我發佈了它作爲答案:)雖然你是對的,我忘了CheckBoxes沒有IsReadOnly屬性,你需要使用IsEnabled – Rachel

回答

2

爲什麼不只是設置IsEnabled="False"

+0

IsEnabled使複選框變灰。有時你想讓它看起來那樣,有時候你不會。 –

+1

@Bahri:從用戶體驗的角度來看,如果你不允許檢查它,它應該提供視覺反饋。這與Windows的其餘部分一起討論,在UX中一致性也是一個好主意。這是默認行爲的原因。如果你不喜歡灰色,你也可以重新設計它。 –

+0

ya。它實際上更加令​​人滿意! :) – Toadums

2

您可以設置IsHitTestVisible =「False」使其不響應用戶點擊。否則,如果viewmodel邏輯確定它是否可點擊,則可以將其綁定到命令。

<Grid> 
    <CheckBox IsHitTestVisible="False" Content="I cannot be clicked at all"/> 
<CheckBox Command="{Binding DoSomethingCommand}" Content="I can be clicked if DoSomethingCanExecute returns true."/> 
</Grid> 

在你的DataContext(視圖模型或其他方式):

RelayCommand _DoSomethingCommand = null; 

    public ICommand DoSomethingCommand 
    { 
     get 
     { 
      if (_DoSomethingCommand== null) 
      { 
       _DoSomethingCommand= new RelayCommand(
        param => DoSomething(), 
        param => DoSomethingCanExecute 
        ); 
      } 
      return _DoSomethingCommand; 
     } 
    } 

    public bool DoSomethingCanExecute 
    { 
     get 
     { 
      return CheckboxShouldBeEnabled(); 
     } 
    } 

    public void DoSomething() 
    { 
     //Checkbox has been clicked 
    } 
+0

毫米,我沒有使用DataContext。複選框只在treenodes的頭文件中,以便可以選中/取消選中樹節點 – Toadums

+0

我明白。但是,通過使用WinForms事件驅動的編程範例,您錯過了WPF的許多強大功能。您可能會對MVVM的力量感到驚訝。 –

1

這可能是有點矯枉過正,但你可以子類複選框,然後覆蓋的OnClick()方法。

1

只有設置IsHitTestVisible="False"只是照顧鼠標,用戶仍然可以使用鍵盤選項卡到CheckBox並更改值。

你應該同時設置IsHitTestVisible="False"Focusable="False"禁用鍵盤以及

+0

這是真的。我忘了鍵盤。 –

1

您可以禁用該複選框,如果禁用的外觀是一個問題,一個風格與殘疾人複選框關聯。正如它在之前的文章中指出的那樣,對於不同的國家有不同的看法。