2011-02-10 65 views
7

我們有一個自定義畫布,它具有與標準MDI應用程序的窗戶非常類似的專用節點。期望的行爲是,如果「窗口」的任何子控件具有焦點,則該「窗口」被認爲是活動的。如何根據子女是否有焦點來定製自定義控件?

現在,IsFocused屬性似乎不是級聯的,意思是如果一個子控件有焦點,它的容器也不會被設置爲'集中',所以我們不能使用它。出於同樣的原因,我們不能在容器上設置IsFocused屬性,因爲我相信這會從小孩那裏偷走它。

我唯一的想法是創建一個名爲HasChildWithFocus或類似的新DP,然後在代碼隱藏中,監聽冒泡事件並設置該標誌。不知道這是最好的方法。 (我們可以將它作爲一個組合附加屬性/附加行爲來實現。)

但是,當然,如果我們可以簡單地詢問一個控件'嘿...你或你的任何孩子是否擁有焦點?'

那麼你可以嗎?

+0

+1對您的附加行爲的想法,該附加行爲偵聽冒泡事件並設置附加屬性。這是我會這樣做的方式,我想不出任何其他明智的想法! – ColinE 2011-02-10 05:39:22

+0

那麼+1我的問題!來吧......幫助一個怪胎出現在這裏! [傻笑](感謝您的反饋,是的......那是我能想到的唯一方法。) – MarqueIV 2011-02-10 06:21:58

回答

8

您可以直接使用UIElement.IsKeyboardFocusWithin這樣的:

<Grid> 
    <Grid.Resources> 
     <Style x:Key="panelStyle" TargetType="Border"> 
      <Setter Property="BorderBrush" Value="PaleGoldenrod"/> 
      <Style.Triggers> 
       <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
        <Setter Property="BorderBrush" Value="PaleGreen"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Resources> 
    <UniformGrid Columns="2"> 
     <Border BorderThickness="10" Style="{StaticResource panelStyle}"> 
      <StackPanel> 
       <TextBox Text="TextBox1"/> 
       <TextBox Text="TextBox2"/> 
      </StackPanel> 
     </Border> 
     <Border BorderThickness="10" Style="{StaticResource panelStyle}"> 
      <StackPanel> 
       <TextBox Text="TextBox3"/> 
       <TextBox Text="TextBox4"/> 
      </StackPanel> 
     </Border> 
    </UniformGrid> 
</Grid> 

在這個例子中包含帶有鍵盤焦點的元素與風格不同的邊框刷邊境。

相關問題