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 Button
Template
. 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à?
quel grand merci. –
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? –
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. –