Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在xaml中更改控件内部的预定义样式_C#_Wpf_Visual Studio 2012_Wpf Controls - Fatal编程技术网

C# 在xaml中更改控件内部的预定义样式

C# 在xaml中更改控件内部的预定义样式,c#,wpf,visual-studio-2012,wpf-controls,C#,Wpf,Visual Studio 2012,Wpf Controls,我在App.xaml中有以下样式: <Style TargetType="{x:Type Button}"> <Style.Resources> <DataTemplate x:Key="Unpressed"> <Image Stretch="Uniform" Source="Img/button1.png"/>

我在App.xaml中有以下样式:

        <Style TargetType="{x:Type Button}">

            <Style.Resources>
                <DataTemplate x:Key="Unpressed">
                    <Image Stretch="Uniform"  Source="Img/button1.png"/>
                </DataTemplate>
                <DataTemplate x:Key="Pressed">
                    <Image Stretch="Uniform" Source="Img/button1_press.png"/>
                </DataTemplate>
            </Style.Resources>

            <Setter Property="ContentTemplate" Value="{StaticResource Unpressed}"/>

            <Style.Triggers>
                <Trigger Property="IsPressed" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource Pressed}"/>
                </Trigger>
            </Style.Triggers>

        </Style>

我想从我的按钮更改数据模板,如下所示:

                    <Button x:Name="Button2">

                    <Style>
                        <Style.Resources>
                            <DataTemplate x:Key="Unpressed">
                                <Image Stretch="Uniform" Source="../Img/button2.png"/>
                            </DataTemplate>
                            <DataTemplate x:Key="Pressed">
                                <Image Stretch="Uniform" Source="../Img/button2_press.png"/>
                            </DataTemplate>
                        </Style.Resources>
                    </Style>

                </Button>


因此,基本上,我所有的按钮都有相同的样式,但每个按钮都有一个唯一的图像,我需要为每个按钮分别更改样式的数据模板。我使用这个简单的代码,它工作得很好(如果你想释放被按下的按钮,请设置计时器)。我希望这将对你有所帮助

xaml代码


这是我建议的解决方案:

对于样式:

<Application.Resources>

    <local:ImgToDisplayConverter x:Key="ImgToDisplayConverter"/>
    <local:ImgPressedToDisplayConverter x:Key="ImgPressedToDisplayConverter"/>

    <Style TargetType="Image" x:Key="PressedButtonImageStyle">
        <Setter Property="Source">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource ImgToDisplayConverter}">
                    <Binding Path="Tag" RelativeSource="{RelativeSource AncestorType=Button}"/>
                </MultiBinding>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsPressed, RelativeSource={RelativeSource AncestorType=Button}}" Value="true">
                <Setter Property="Source">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource ImgPressedToDisplayConverter}">
                            <Binding Path="Tag" RelativeSource="{RelativeSource AncestorType=Button}"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

</Application.Resources>

您可以根据需要更改代码。

如果在App.xaml资源中设置样式,并给它一个键,您将能够使用“style={StaticResource myStyle}”全局访问它。这不是问题,所有按钮都会自动获得样式,我想用图标路径更改DataTempalte
public void male_Click(object sender, RoutedEventArgs e)
        {


            System.Windows.Controls.Image img = new System.Windows.Controls.Image();
            img.Source = new BitmapImage(new Uri(@"pack://application:,,,/maindocket;component/Imagesrc/logotype/USER_MALE_SELECTED.png"));
            male.Content = img;
}
<Application.Resources>

    <local:ImgToDisplayConverter x:Key="ImgToDisplayConverter"/>
    <local:ImgPressedToDisplayConverter x:Key="ImgPressedToDisplayConverter"/>

    <Style TargetType="Image" x:Key="PressedButtonImageStyle">
        <Setter Property="Source">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource ImgToDisplayConverter}">
                    <Binding Path="Tag" RelativeSource="{RelativeSource AncestorType=Button}"/>
                </MultiBinding>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsPressed, RelativeSource={RelativeSource AncestorType=Button}}" Value="true">
                <Setter Property="Source">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource ImgPressedToDisplayConverter}">
                            <Binding Path="Tag" RelativeSource="{RelativeSource AncestorType=Button}"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

</Application.Resources>
    <Button Tag="button1"  Width="100" Height="100" HorizontalAlignment="Left">
        <ContentControl>
            <Image Stretch="Uniform" Style="{StaticResource PressedButtonImageStyle}" IsHitTestVisible="False"/>
        </ContentControl>
    </Button>
 class ImgToDisplayConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string image = values[0].ToString();
        string resourceName = String.Format("pack://application:,,,/{0}.png", image);

        return new BitmapImage(new Uri(resourceName));
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

class ImgPressedToDisplayConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string image = values[0].ToString();
        string resourceName = String.Format("pack://application:,,,/{0}_pressed.png", image);

        return new BitmapImage(new Uri(resourceName));
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}