- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经在这个问题上苦苦思索了很长一段时间,所以我想我应该在这里问一下,看看是否有人可以帮助我。首先,我是 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/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!