UWP 颜色选取器使用绑定在工作表之间传输颜色



我试图将所选颜色从我的拾色器传递到另一个

我有以下 ColorChanged 事件,该事件成功写入控制台,它位于项目的 Settings_Page.xaml 部分:

public Color _TextColour;
private void TextColourPicker_ColorChanged(ColorPicker sender, ColorChangedEventArgs args)
{
_TextColour = TextColourPicker.Color;
Debug.WriteLine(_TextColour);
}

然后,我尝试将其"读取"到名为 MainPage.xaml 的单独页面上的 XAML 绑定中。它用于更改导航视图项的颜色。我试图通过以下方式执行此操作:

<NavigationViewItem x:Name="TestItem"                                         
Content="ColourTest" 
Tag="Test_Page" 
FontSize="22" 
HorizontalAlignment="Stretch" 
FontWeight="Bold" 
Foreground="{Binding Path=Settings_Page._TextColour, Mode=OneWay}">
<NavigationViewItem.Icon>
<SymbolIcon Symbol="Shop"/>
</NavigationViewItem.Icon>
</NavigationViewItem>

它目前不起作用。它将文本显示为黑色。我觉得我从错误的角度处理这个问题,但不确定我哪里出错了。我觉得问题绝对不在于设置页面,而在于我处理绑定的方式。

不能在两个不同的页面之间执行数据绑定。在 UWP 中,有一个Frame控件,用于在页面和句柄之间导航Page生存期。关键的观察结果是,当您在页面之间导航时,内存中始终只有一个页面(除非您使用NavigationCacheMode(。因此,一旦您从SettingsPage导航回来,它就消失了,您无法绑定到它。此外 - 再次导航到SettingsPage会生成页面的新实例,这也很高兴知道 - 数据绑定要求您绑定到实例,在这种情况下会发生变化。

因此,如果您想在两个页面之间传递一些值,则需要其他机制来实现它。最简单的方法是某种static类,您可以在其中分配选定的颜色或在第一页上具有public static属性,您将在从第二页导航之前分配该属性。但请记住,您还需要一个额外的非静态属性用于数据绑定,因为它不适用于static。这肯定不是最干净的解决方案,但它可以在更简单的场景中完成工作。

如果已部署 MVVM 框架,则导航堆栈视图模型保留在内存中时,可以通过更好的方式解决此问题 - 例如,可以使用事件中心或信使,并使用接收方页面订阅的集数据发布消息。MvvmCross和Mvvm Light都有能够做到这一点的解决方案。

前景是画笔类型属性,并且您正在绑定颜色类型值。将_TextColour类型更改为"画笔",并填充它

_TextColour = new SolidColorBrush(TextColourPicker.Color);

最新更新