C# 在WP8中以编程方式更改渐变样式

C# 在WP8中以编程方式更改渐变样式,c#,windows-phone-8,gradient,tile,brush,C#,Windows Phone 8,Gradient,Tile,Brush,我的应用程序中有一些自定义控件。其中一个自定义控件包含渐变背景,我希望用户能够在线性和径向渐变样式之间动态切换。如何在代码中执行此操作?我的自定义控件XAML: <UserControl x:Class="App.tile" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http

我的应用程序中有一些自定义控件。其中一个自定义控件包含渐变背景,我希望用户能够在线性和径向渐变样式之间动态切换。如何在代码中执行此操作?我的自定义控件XAML:

<UserControl x:Class="App.tile"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}" Height="191.94" Width="406.91">

<Grid x:Name="LayoutRoot">
    <Grid.Background>
        <RadialGradientBrush>
            <GradientStop Color="#FF092949" Offset="0"/>
            <GradientStop Color="#FF06192C" Offset="1"/>
        </RadialGradientBrush>
    </Grid.Background>
    <TextBlock HorizontalAlignment="Left" Margin="10,134,0,0" TextWrapping="Wrap" x:Name="tileTitle" Text="Project" VerticalAlignment="Top" FontSize="36"/>
</Grid>
</UserControl>
非常感谢

更新:

现在就尝试这个:

    <phone:PhoneApplicationPage.Resources>
    <LinearGradientBrush x:Key="linearBrush" StartPoint="0,0.5" EndPoint="1,0.5">
        <GradientStop Color="Yellow" Offset="0.0" />
        <GradientStop Color="Red" Offset="0.25" />
        <GradientStop Color="Blue" Offset="0.75" />
        <GradientStop Color="LimeGreen" Offset="1.0" />
    </LinearGradientBrush>

    <RadialGradientBrush x:Key="radialBrush" GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
        <RadialGradientBrush.GradientStops>
            <GradientStop Color="Yellow" Offset="0" />
            <GradientStop Color="Red" Offset="0.25" />
            <GradientStop Color="Blue" Offset="0.75" />
            <GradientStop Color="LimeGreen" Offset="1" />
        </RadialGradientBrush.GradientStops>
    </RadialGradientBrush>
</phone:PhoneApplicationPage.Resources>

        private void settingsPage_Loaded(object sender, RoutedEventArgs e)
    {
        // settingsPage was loaded, set the attributes for the exampleTile
        exampleTile.tileTitle.Text = "History";

        // Get the gradient type from settings
        try
        {
            gradientType = settings["gradientType"].ToString();
        }
        catch (KeyNotFoundException)
        {
            gradientType = "radial";
        }

        if (gradientType.Equals("radial"))
        {
            // Check the radialRadioButton
            radialRadioButton.IsChecked = true;
        }
        else if (gradientType.Equals("linear"))
        {
            // Check the linearRadioButton
            linearRadioButton.IsChecked = true;
        }
    }

        private void linearRadioButton_Checked(object sender, RoutedEventArgs e)
    {
        // The linearRadioButton was checked, update the exampleTile
        (exampleTile as tile).Background = (LinearGradientBrush)this.Resources["linearBrush"];
    }

    private void radialRadioButton_Checked(object sender, RoutedEventArgs e)
    {
        // The radialRadioButton was checked, update the exampleTile
        this.exampleTile.Background = (LinearGradientBrush)this.Resources["radialBrush"];
    }

私有无效设置已加载(对象发送方,路由目标e)
{
//settingsPage已加载,请设置exampleTile的属性
exampleTile.tileTitle.Text=“历史”;
//从设置中获取渐变类型
尝试
{
gradientType=设置[“gradientType”]。ToString();
}
catch(KeyNotFoundException)
{
gradientType=“径向”;
}
if(梯度类型等于(“径向”))
{
//检查RadialRadio按钮
radialRadioButton.IsChecked=true;
}
else if(gradientType.Equals(“线性”))
{
//检查LineArradio按钮
linearRadioButton.IsChecked=true;
}
}
已选中专用无效线箭头按钮(对象发送器,路由目标e)
{
//选中LinearRadio按钮,更新示例
(例如,tile作为tile.Background=(LinearGradientBrush)this.Resources[“linearBrush”];
}
已选中专用无效radialRadioButton(对象发送器,路由目标e)
{
//已选中radialRadioButton,请更新示例
this.exampleTile.Background=(LinearGradientBrush)this.Resources[“radialBrush”];
}

但它会导致NullReferenceException(未设置为对象的实例)

可能可以通过
样式或更改笔刷来完成。我将尝试第二种方式(有关和的更多信息):

1。使用资源的方法:

在XAML中:

<phone:PhoneApplicationPage.Resources>
    <LinearGradientBrush x:Key="linearBrush" StartPoint="0,0.5" EndPoint="1,0.5">
        <GradientStop Color="Yellow" Offset="0.0" />
        <GradientStop Color="Red" Offset="0.25" />
        <GradientStop Color="Blue" Offset="0.75" />
        <GradientStop Color="LimeGreen" Offset="1.0" />
    </LinearGradientBrush>

    <RadialGradientBrush x:Key="radialBrush" GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
        <RadialGradientBrush.GradientStops>
            <GradientStop Color="Yellow" Offset="0" />
            <GradientStop Color="Red" Offset="0.25" />
            <GradientStop Color="Blue" Offset="0.75" />
            <GradientStop Color="LimeGreen" Offset="1" />
        </RadialGradientBrush.GradientStops>
    </RadialGradientBrush>
</phone:PhoneApplicationPage.Resources>
您还可以在XAML中使用这些资源。当然,您可以在App.resources中定义这些资源,这样您就可以在整个应用程序中使用tchem,而不仅仅是在这个页面上

2。这也可以通过一种艰难的方式完成——代码中的所有内容:
首先,我将在主页中定义画笔:

LinearGradientBrush linear = new LinearGradientBrush();
RadialGradientBrush radial = new RadialGradientBrush();

public MainPage()
{
   InitializeComponent();

   linear.StartPoint = new Point(0, 0);
   linear.EndPoint = new Point(1, 1);
   linear.GradientStops.Add(new GradientStop() { Color = Colors.Yellow, Offset = 0.0 });
   linear.GradientStops.Add(new GradientStop() { Color = Colors.Red, Offset = 0.25 });
   linear.GradientStops.Add(new GradientStop() { Color = Colors.Blue, Offset = 0.75 });
   linear.GradientStops.Add(new GradientStop() { Color = Colors.Green, Offset = 1.0 });

   radial.GradientOrigin = new Point(0.5, 0.5);
   radial.Center = new Point(0.5, 0.5);
   radial.RadiusX = 0.5;
   radial.RadiusY = 0.5;
   radial.GradientStops.Add(new GradientStop() { Color = Colors.Yellow, Offset = 0.0 });
   radial.GradientStops.Add(new GradientStop() { Color = Colors.Red, Offset = 0.25 });
   radial.GradientStops.Add(new GradientStop() { Color = Colors.Blue, Offset = 0.75 });
   radial.GradientStops.Add(new GradientStop() { Color = Colors.Green, Offset = 1.0 });
}
然后您可以自由使用它们:

private void linearRadioButton_Checked(object sender, RoutedEventArgs e)
{
    LaoutRoot.Background = linear;
    // or you can change button's background
    (sender as RadioButton).Background = radial;
    // or you can build other logic
    if ((bool)(sender as RadioButton).IsChecked)
        LayoutRoot.Background = linear;
    else LayoutRoot.Background = radial;        
}

它可能通过
样式
或更换画笔来完成。我将尝试第二种方式(有关和的更多信息):

1。使用资源的方法:

在XAML中:

<phone:PhoneApplicationPage.Resources>
    <LinearGradientBrush x:Key="linearBrush" StartPoint="0,0.5" EndPoint="1,0.5">
        <GradientStop Color="Yellow" Offset="0.0" />
        <GradientStop Color="Red" Offset="0.25" />
        <GradientStop Color="Blue" Offset="0.75" />
        <GradientStop Color="LimeGreen" Offset="1.0" />
    </LinearGradientBrush>

    <RadialGradientBrush x:Key="radialBrush" GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
        <RadialGradientBrush.GradientStops>
            <GradientStop Color="Yellow" Offset="0" />
            <GradientStop Color="Red" Offset="0.25" />
            <GradientStop Color="Blue" Offset="0.75" />
            <GradientStop Color="LimeGreen" Offset="1" />
        </RadialGradientBrush.GradientStops>
    </RadialGradientBrush>
</phone:PhoneApplicationPage.Resources>
您还可以在XAML中使用这些资源。当然,您可以在App.resources中定义这些资源,这样您就可以在整个应用程序中使用tchem,而不仅仅是在这个页面上

2。这也可以通过一种艰难的方式完成——代码中的所有内容:
首先,我将在主页中定义画笔:

LinearGradientBrush linear = new LinearGradientBrush();
RadialGradientBrush radial = new RadialGradientBrush();

public MainPage()
{
   InitializeComponent();

   linear.StartPoint = new Point(0, 0);
   linear.EndPoint = new Point(1, 1);
   linear.GradientStops.Add(new GradientStop() { Color = Colors.Yellow, Offset = 0.0 });
   linear.GradientStops.Add(new GradientStop() { Color = Colors.Red, Offset = 0.25 });
   linear.GradientStops.Add(new GradientStop() { Color = Colors.Blue, Offset = 0.75 });
   linear.GradientStops.Add(new GradientStop() { Color = Colors.Green, Offset = 1.0 });

   radial.GradientOrigin = new Point(0.5, 0.5);
   radial.Center = new Point(0.5, 0.5);
   radial.RadiusX = 0.5;
   radial.RadiusY = 0.5;
   radial.GradientStops.Add(new GradientStop() { Color = Colors.Yellow, Offset = 0.0 });
   radial.GradientStops.Add(new GradientStop() { Color = Colors.Red, Offset = 0.25 });
   radial.GradientStops.Add(new GradientStop() { Color = Colors.Blue, Offset = 0.75 });
   radial.GradientStops.Add(new GradientStop() { Color = Colors.Green, Offset = 1.0 });
}
然后您可以自由使用它们:

private void linearRadioButton_Checked(object sender, RoutedEventArgs e)
{
    LaoutRoot.Background = linear;
    // or you can change button's background
    (sender as RadioButton).Background = radial;
    // or you can build other logic
    if ((bool)(sender as RadioButton).IsChecked)
        LayoutRoot.Background = linear;
    else LayoutRoot.Background = radial;        
}

@Erik你在哪里调用了这个.exampleTile.Background=radial?我还编辑了我的答案以使用已定义的资源,这样您也可以在Xaml中使用tchem-那么就不需要在构造函数中执行此操作。在选中radialRadioButton时尝试调用它-如果在磁贴初始化之前选中它,这可能是个问题吗?当我使用XAML时也发生了同样的情况resources@Erik当然,这将是一个问题,因为你的瓷砖不存在,这就是为什么你得到了NullReferenceException@Erik你的瓷砖是什么?它是什么时候创建的?这是我的第一个想法——但当我在加载的事件中放入检查radiobutton的代码时,它不应该这样做。我想当它加载后,我就可以继续更新tile@Erik您在哪里调用了这个.exampleTile.Background=radial?我还编辑了我的答案以使用已定义的资源,这样您也可以在Xaml中使用tchem-那么就不需要在构造函数中执行此操作。在选中radialRadioButton时尝试调用它-如果在磁贴初始化之前选中它,这可能是个问题吗?当我使用XAML时也发生了同样的情况resources@Erik当然,这将是一个问题,因为你的瓷砖不存在,这就是为什么你得到了NullReferenceException@Erik你的瓷砖是什么?它是什么时候创建的?这是我的第一个想法——但当我在加载的事件中放入检查radiobutton的代码时,它不应该这样做。我想当它被加载后,我就可以继续更新互动程序了