我试图将所选颜色从我的拾色器传递到另一个
我有以下 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);