2010-10-05 3 views
0

Comment puis-je modifier un modèle Button dynamiquement?comment modifier le modèle de bouton dynamiquement WPF

J'ai un ComboBox où en changeant sa valeur sélectionnée je veux changer un ButtonTemplate. C'est ce que je suis en train de faire:

<Window.Resources> 
    <ControlTemplate x:Key="ButtonControlTemplate1" TargetType="{x:Type Button}"> 
     <Grid> 
      <Rectangle Fill="#FF2D2D7A" Margin="7.5,9.5,8.5,11" Stroke="Black" 
         RadiusX="45" RadiusY="45" StrokeThickness="6"/> 
     </Grid> 
    </ControlTemplate> 
    <ControlTemplate x:Key="ButtonControlTemplate2" TargetType="{x:Type Button}"> 
     <Grid> 
      <ed:RegularPolygon Fill="#FFE7F9C9" Height="Auto" InnerRadius="0.47211" 
           Margin="20.5,16,15.5,8" PointCount="5" Stretch="Fill" 
           Stroke="Black" StrokeThickness="6" Width="Auto"/> 
     </Grid> 
    </ControlTemplate> 
</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <ComboBox Name="GroupBoxHeaderComboBox" ItemsSource="{Binding Path=collection}" 
       DisplayMemberPath="Key" Height="52" Margin="211.5,60,230.5,0" 
       VerticalAlignment="Top" SelectedIndex="1"/> 
    <Button Content="Button" HorizontalAlignment="Left" Height="102" Margin="47.5,0,0,91" 
      VerticalAlignment="Bottom" Width="132" 
      Template="{DynamicResource ButtonControlTemplate2}"/> 
    <Button Content="Button" HorizontalAlignment="Right" Height="112.5" Margin="0,0,27.5,85" 
      VerticalAlignment="Bottom" Width="153" 
      Template="{DynamicResource ButtonControlTemplate1}"/> 
    <Button Content="Button" Height="102" Margin="239.5,0,252.5,13.5" 
      VerticalAlignment="Bottom" 
      Template="{Binding ElementName=GroupBoxHeaderComboBox, Path=SelectedItem.Value}"/> 
</Grid> 

Et voici les associés Template s:

<Window.Resources> 
    <ControlTemplate x:Key="ButtonControlTemplate1" TargetType="{x:Type Button}"> 
     <Grid> 
      <Rectangle Fill="#FF2D2D7A" Margin="7.5,9.5,8.5,11" Stroke="Black" 
         RadiusX="45" RadiusY="45" StrokeThickness="6"/> 
     </Grid> 
    </ControlTemplate> 
    <ControlTemplate x:Key="ButtonControlTemplate2" TargetType="{x:Type Button}"> 
     <Grid> 
      <ed:RegularPolygon Fill="#FFE7F9C9" Height="Auto" InnerRadius="0.47211" 
           Margin="20.5,16,15.5,8" PointCount="5" Stretch="Fill" 
           Stroke="Black" StrokeThickness="6" Width="Auto"/> 
     </Grid> 
    </ControlTemplate> 
</Window.Resources> 

et le code derrière:

public partial class MainWindow : Window 
{ 
    public Dictionary<string, string> collection 
    { 
     get; 
     private set; 
    } 

    public MainWindow() 
    { 
     this.InitializeComponent(); 
     DataContext = this; 
     collection = new Dictionary<string, string>() 
     { 
      { "DynamicResource ButtonControlTemplate2", "{DynamicResource ButtonControlTemplate2}"}, 
      { "DynamicResource ButtonControlTemplate1", "{DynamicResource ButtonControlTemplate2}"}, 

     }; 
    // Insert code required on object creation below this point. 
    } 
} 

Est il y a une autre façon générique d'accomplir cela? ... Je veux que la plupart du code w ould être xaml.

EDIT:

Y at-il un point de le faire en utilisant un style? Disons que je veux plus d'un objet à agir, sinon y a-t-il un point pour changer le style et tout faire à partir de là?

Répondre

2
public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      DataContext = this; 
     } 

     public Dictionary<string, ControlTemplate> collection 
     { 
      get 
      { 
       Dictionary<string, ControlTemplate> controlTemplates = new Dictionary<string, ControlTemplate>(); 
       controlTemplates.Add("ButtonControlTemplate1", FindResource("ButtonControlTemplate1") as ControlTemplate); 
       controlTemplates.Add("ButtonControlTemplate2", FindResource("ButtonControlTemplate2") as ControlTemplate); 
       return controlTemplates; 
      } 
     } 
    } 
+0

quel grand merci. –

+0

Je semble avoir un problème que je mets FindResource à l'intérieur de la VM et je n'ai pas acsses à hom pouvez-vous s'il vous plaît aider avec elle? –

+0

Les modèles de contrôle et autres ressources appartiennent à la vue et votre machine virtuelle ne doit pas référencer votre vue si vous suivez MVVM. Je stocker les clés dans la machine virtuelle ("ButtonControlTemplate1", "ButtonControlTemplate2") et utiliser du code derrière dans la classe de vue pour mapper les clés à un ControlTemplatwe en utilisant FindResource.Si vous souhaitez stocker les ControlTemplates dans la machine virtuelle, créez-les dans la machine virtuelle à l'aide du code ou affichez la collection ControlTemplate dans la machine virtuelle dans son gestionnaire Loaded. –

1

Vous pouvez utiliser un déclencheur de données et tout faire en xaml.

Il utilise un arbre, mais le concept est le même

<Window x:Class="WpfBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:WpfBindingTest" 
Title="Window3" Height="300" Width="300" Name="win3" > 
<Window.Resources> 
    <XmlDataProvider x:Key="treeData" XPath="*"> 
     <x:XData> 
      <Items Name="Items" xmlns=""> 
       <Item1/> 
       <Item2> 
        <Item22/> 
        <Item12/> 
        <Item13> 
         <Item131/> 
         <Item131/> 
        </Item13> 
       </Item2> 
      </Items> 
     </x:XData> 
    </XmlDataProvider> 
    <HierarchicalDataTemplate ItemsSource="{Binding XPath=child::*}" 

x: Key = "template">

de here.

(je viens de googlé pour obtenir un exemple plus rapide)

0

Créer un ControlTemplate en ressources Windows,

<Window.Resources> 
    <ControlTemplate x:Key="GreenTemplate" TargetType="{x:Type Button}"> 
     <Grid> 
      <Ellipse Fill="Green"/> 
      <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
</Window.Resources> 

maintenant dans le temps d'exécution, vous pouvez modifier la propriété de modèle de bouton.

private void Button_Clicked(object sender, RoutedEventArgs e) 
    { 
     Button btn = e.OriginalSource as Button; 
     if (btn != null) 
     { 
      btn.Template = FindResource("GreenTemplate") as ControlTemplate; 
     } 
    } 
Questions connexes