ini*_*x42 2 c# xaml mvvm win-universal-app
我有一个“主框架”(仅包含 CommandBar)和一些子框架,它们最初位于集线器中。基本上,当通过“OnNavigated..”单击一个集线器元素时,框架会发生变化。
现在我有一些按钮(例如 1 和 2)不应该是可见的,只有在选择了某些帧时:
我已经尝试过使用 getter 和 setter 方法:
在 Master-Frame 代码方法中:
public static Visibility setVisibility
{
set { Button1.Visibility = value; }
}
Run Code Online (Sandbox Code Playgroud)
并在后面的 Frame1 代码中:
MasterFrame.setVisibility = Visibility.Visible;
Run Code Online (Sandbox Code Playgroud)
但是我从 Button1 收到错误“对象引用是...”,因为我必须使用“静态”修饰符才能从 Frame1 访问按钮。
我怎样才能访问按钮?
我什至不知道我是否对代码隐藏使用了“正确”的方法,但是 MVVM 似乎没有用,因为这不是 CRUD 应用程序(没有用户输入的简单信息。)
我什至不知道我是否对代码隐藏使用了“正确”的方法,但是 MVVM 似乎没有用,因为这不是 CRUD 应用程序(没有用户输入的简单信息。)
不,MVVM 很有用,在 MVVM 设计模式中,开发人员可以编写应用程序逻辑,设计人员可以创建 UI。尽管您不是在开发 CRUD 应用程序,但仍然可以使用 MVVM 模式。
在 UWP 应用中,数据绑定非常强大。在这种情况下,您可以将数据绑定与Converter结合使用来解决您的问题。
我这里写了一个示例,使用Data Binding进行事件,并用于Converter判断Button和AppBarButtons的Visibility :
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.Resources>
<Converter:VisiableOrNot x:Key="cvt" />
<Converter:NaviButtonShowOrNot x:Key="btncvt" />
</Grid.Resources>
<CommandBar>
<CommandBar.Content>
<Grid>
<TextBlock Text="Master-Frame" FontSize="20" Margin="20,10" />
</Grid>
</CommandBar.Content>
<AppBarButton Icon="Accept" Label="appbarbutton" Visibility="{Binding ElementName=mainPageframe, Path=Content.BaseUri.AbsoluteUri, Converter={StaticResource cvt}}" />
<AppBarButton Icon="Cancel" Label="appbarbutton" Visibility="{Binding ElementName=mainPageframe, Path=Content.BaseUri.AbsoluteUri, Converter={StaticResource cvt}}" />
</CommandBar>
<Frame x:Name="mainPageframe" Margin="0,55">
<Hub x:Name="hub" SectionHeaderClick="{x:Bind MainPageViewModel.hub_SectionHeaderClick}">
<HubSection x:Name="image1" Header="Image1" Width="200" IsHeaderInteractive="True">
<DataTemplate>
<Grid>
<Image Source="Assets/111.png" Stretch="None" />
</Grid>
</DataTemplate>
</HubSection>
<HubSection x:Name="image2" Header="Image2" Width="200" IsHeaderInteractive="True">
<DataTemplate>
<Grid>
<Image Grid.Row="0" Source="Assets/222.png" Stretch="None" />
</Grid>
</DataTemplate>
</HubSection>
<HubSection x:Name="image3" Header="Image3" Width="200" IsHeaderInteractive="True">
<DataTemplate>
<Grid>
<Image Source="Assets/333.png" Stretch="None" />
</Grid>
</DataTemplate>
</HubSection>
</Hub>
</Frame>
<Button Content="Go Back" Click="{x:Bind MainPageViewModel.Button_Click}" Background="PaleGreen" VerticalAlignment="Bottom" Margin="50,20" Visibility="{Binding ElementName=mainPageframe, Path=Content.BaseUri.AbsoluteUri, Converter={StaticResource btncvt}}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
VisiableOrNot转换器代码:
public class VisiableOrNot : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
Uri uri = new Uri(value.ToString());
if (uri != null)
{
if (uri.Equals("ms-appx:///View/Page3.xaml"))
{
return Visibility.Visible;
}
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的demo的渲染图,AppBarButtons只有在子框架的内容为Page3时才能看到。并且当它在 MainPage 上时无法看到导航后退按钮:

这是我的演示,您可以下载并查看。