UWP ColorPicker 使用绑定在工作表之间传输颜色

UWP ColorPicker transfer color between sheets using Binding

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

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

public Color _TextColour;

        private void TextColourPicker_ColorChanged(ColorPicker sender, ColorChangedEventArgs args)
        {

            _TextColour = TextColourPicker.Color;
            Debug.WriteLine(_TextColour);
        }

然后我尝试将其 "read" 放入名为 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>

目前无法使用。它将文本显示为黑色。我觉得我是从错误的角度来处理这个问题的,但不确定我哪里出了问题。我觉得问题绝对不在 SettingsPage 中,而是在我处理 Binding 的方式中。

前景是Brush类型属性,你绑定的是Color类型的值。将 _TextColour 的类型更改为 Brush,并使用

填充它
_TextColour = new SolidColorBrush(TextColourPicker.Color);

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

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

如果您有一个 MVVM 框架,如果您的导航堆栈视图模型保留在内存中,您可以更好地解决这个问题 - 例如,您可以使用事件中心或 Messenger 并使用设置接收者页面订阅的数据。 MvvmCross 和 Mvvm Light 都有能够做到这一点的解决方案。