2010-11-23 60 views
1

我正在實現兩個狀態元素。我有兩個xaml(第一個狀態和第二個狀態)。我應該點擊鼠標來改變狀態。WPF。 TwoState元素

我創建自己的控制孩子使用XAML

<Style TargetType="l:ActionButton"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="l:ActionButton"> 
       <ContentControl x:Name="LayoutRoot"> 
        <ContentControl.Resources> 
         <ControlTemplate x:Key="buttonDownTemplate"> 
          <Canvas>.....</Canvas> 
         </ControlTemplate> 
         <ControlTemplate x:Key="buttonUpTemplate"> 
          <Canvas>.....<Canvas>    
         </ControlTemplate> 
        </ContentControl.Resources> 
       </ContentControl> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

在OnApplyTemplate我處理模板改變

public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     var btn = GetTemplateChild("LayoutRoot") as ContentControl; 
     if (btn != null) 
     { 
      btn.MouseLeftButtonDown += (o, e) => 
      { 
       //sample change template 
       var template = (ControlTemplate)btn.FindResource("buttonDownTemplate"); 
       this.Template = template; 
      }; 

     } 

    } 

但是當我運行的應用程序與我的控制,我得到:「具有相同鍵的項已經被添加了。「例外?

這是怎麼回事。我的方式是對的嗎?

謝謝,安德魯

回答

4

這絕對不是要走的路。如果你想要一個擁有兩個獨立狀態的控件,你應該重新設置ToggleButton。你不想完全換出ControlTemplate,因爲這非常慢。相反,您可以將兩個視覺效果放在同一個模板中,並根據狀態顯示/隱藏它們。

這是一個切換按鈕看起來像一個風格完成你後什麼(它不需要後面的代碼):

<Style x:Key="twoStateButton" TargetType="{x:Type ToggleButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Grid> 
        <Canvas x:Name="buttonDownTemplate" Background="#202020" Visibility="Collapsed"> 
         ... 
        </Canvas> 
        <Canvas x:Name="buttonUpTemplate" Background="#C0C0C0"> 
         ... 
        </Canvas> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsChecked" Value="True"> 
         <Setter TargetName="buttonDownTemplate" Property="Visibility" Value="Visible" /> 
         <Setter TargetName="buttonUpTemplate" Property="Visibility" Value="Collapsed" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style>