gpt4 book ai didi

c# - 在适用于 Windows 8.1 的 C# XAML 中,如何将样式绑定(bind)到变量?

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:17 24 4
gpt4 key购买 nike

我已经在这个问题上苦苦思索了很长一段时间,所以我想我应该在这里问一下,看看是否有人可以帮助我。首先,我是 C#、XAML 和 Windows 8 编程的新手。

我想做的基本事情是:基于对数据模型的更改(我在 Button_Click 处理程序中的小测试平台项目中正在做的),我想更改 <Style> 中的前景值.我已经成功地更改了 <TextBlock> 中的前景值,但没有更改在另一个 <Style> 上运行的 <TextBlock> 上的值。

这是我所做的(请原谅我的冗长,希望它有意义):

我有一个名为 MyColorDataSource 的类,我将其用作我的 MyPage.xaml 页面中的绑定(bind)目标。这是该类的相关代码:

public class MyColorDataSource 
{
private MyColors _brush1;

public MyColors Brush1
{
get { return _brush1; }
set { _brush1 = value; }
}

private MyColors _brush2;

public MyColors Brush2
{
get { return _brush2; }
set { _brush2 = value; }
}


public MyColorDataSource()
{
_brush1 = new MyColors();
_brush2 = new MyColors();

_brush1.BrushColor= new SolidColorBrush(Colors.DarkRed);
_brush2.BrushColor = new SolidColorBrush(Colors.Pink);
}
}

您会注意到 MyColorDataSource 中的变量属于 MyColors 类型。这是该类的定义:

public class MyColors : INotifyPropertyChanged
{

private SolidColorBrush _brushColor;

public SolidColorBrush BrushColor
{
get { return _brushColor; }
set {
if (value != _brushColor)
{
_brushColor = value;
NotifyPropertyChanged("BrushColor");
}
}
}

#region INotifyPropertyChanged Members

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
Debug.WriteLine("in NotifyPropertyChanged for " + propertyName);
}
}
public event PropertyChangedEventHandler PropertyChanged;

#endregion
}

这是我编写的 XAML,包含两个 <TextBlock> 元素,其中一个具有直接绑定(bind)到数据源的 Foreground 属性,其中一个使用我试图绑定(bind)到数据源的 <Style>。在 MyPage.xaml 中:

<Page.Resources>
<Style TargetType="TextBlock" x:Key="BoundColor">
<Setter Property="Foreground" Value="{Binding Brush2.BrushColor}" />
</Style>
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock x:Name="TextBlockToFormatWithBinding" Text="Direct Binding" Foreground="{Binding BrushColor}" />
<TextBlock x:Name="TextBlockToFormatWithStyleBinding" Text="Binding through style" Style="{StaticResource BoundColor}"/>
</StackPanel>

我已经在 App.xaml.cs 中设置了我的 DataSource 变量:

public sealed partial class App : Application
{

public static MyColorDataSource ColorDataSource;

public App()
{
this.InitializeComponent();
this.Suspending += this.OnSuspending;

ColorDataSource = new MyColorDataSource();
}
}

然后我访问 MyPage.xaml.cs 中的数据源:

public MyPage()
{
this.InitializeComponent();
App.ColorDataSource.Brush1.BrushColor = new SolidColorBrush(Colors.DarkOliveGreen);
App.ColorDataSource.Brush2.BrushColor = new SolidColorBrush(Colors.DarkKhaki);
this.DataContext = App.ColorDataSource;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
TextBlockToFormatWithBinding.DataContext = App.ColorDataSource.Brush1;
// TextBlockToFormatWithStyleBinding.DataContext = App.ColorDataSource.Brush2; // tried this, it did nothing
}

如果你还在我身边,谢谢你!发生的事情是第一个 <TextBlock> 按预期显示,颜色为暗橄榄绿。第二个<TextBlock>根本没有出现,我假设它的前景默认为黑色(页面背景也是黑色,所以我看不到)。当我将 <Style> 中的前景值更改为“DarkRed”之类的值时,瞧,它会按预期显示。所以 <TextBlock> 肯定存在,但它并没有像我希望的那样从 DataModel 获取前景值。

以前有没有人遇到过这个问题,如果有,您是如何解决的?我真的不想单独更改每个 <TextBlock> ,因为我打算尝试为 <ListView> 中的项目设置样式,而且我真的不想遍历所有 <Item> 并一个一个地更改它们的样式。在使用了很多 HTML/CSS/jQuery 之后,我习惯于按类设置样式,而不是一次一个地迭代设置样式。

在此先感谢您提供的任何帮助或建议。

编辑:

我确实设法遇到了一种让我非常接近我在这里尝试做的技术,部分是在下面的答案的帮助下(再次感谢!)。希望如果其他人提出类似的问题,这会有所帮助。

    <SolidColorBrush x:Key="myBrush" Color="#330000FF" />
<Style TargetType="TextBlock" x:Key="BoundColor">
<Setter Property="Foreground" Value="{StaticResource myBrush}" />
</Style>

然后在我的代码隐藏中,我可以做这样的事情:

((SolidColorBrush)Resources["myBrush"]).Color = Color.FromArgb(64, 255, 0, 0);

这本身并没有将元素的颜色放入数据模型中,但老实说,元素的颜色真的属于数据模型吗?我通常会说它不会。

请注意,我没有任何运气让这项技术在我试图穿上它的“可见性”<Setter> 上起作用(我希望 TextBlock 有时隐藏,有时可见),但对于颜色和其他基于对象的<Setter> s 它工作得很好。我的假设基于我所知道的一点点,这是真的,因为可见性是一个枚举,而不是类。所以虽然我可以把它放在我的 <Page.Resources> 中:

    <Visibility x:Key="TextBlockVisibility">0</Visibility>

这在 <Style> 中:

    <Setter Property="Visibility" Value="{StaticResource TextBlockVisibility}" />

我似乎无法以 TextBlockVisibility 会注意到值变化或受其影响的方式更改 <Style> 的值。

最佳答案

对不起,你不能。就像许多非常有用的 WPF 功能(您的代码在 WPF 程序中工作得很好)一样,这是 AFAIK 在 Windows Phone 上不受支持。

也就是说,您可以解决该问题。最明显的解决方案是首先不使用样式。另一种解决方案是使用“帮助器”对象作为样式中的实际 setter 值,它本身通过样式 setter 设置的附加属性来管理绑定(bind)。

可以在 David Anson 的网站上找到此技术的示例,网址为: The taming of the phone [New SetterValueBindingHelper sample demonstrates its usefulness on Windows Phone 7 (and Silverlight 4)]

使用该示例,您的样式 setter 可能看起来像这样:

<Setter Property="delay:SetterValueBindingHelper.PropertyBinding">
<Setter.Value>
<delay:SetterValueBindingHelper
Property="Foreground"
Binding="{Binding Brush2.BrushColor}"/>
</Setter.Value>
</Setter>

(注意:我实际上并没有为您的代码测试一个工作示例;您可能需要对绑定(bind)本身进行一些调整才能获得正确的数据上下文,因为我不确定它是否会正确地从具有额外间接寻址的页面。)

关于c# - 在适用于 Windows 8.1 的 C# XAML 中,如何将样式绑定(bind)到变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29570591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com