2017-07-30 39 views
1

作为一个新手,我正在尝试为autor开发一个应用程序。工作区页面包含一个带有两个柱的网格。这些列(单个或两个)的可视性由单选按钮控制。每列包含WorkspaceUsercontrol的一个实例。
此用户控件的splitview窗格将包含章节,场景等 - 内容将填充不同类型(文本,图像,html等)的列表视图项目应该可以将列表视图项目从一个实例移动到其他北拖,所以一个实例的变化应该被另一个实例所反映。这是迄今为止代码:usercontrol的两个实例

编辑 为了使它更容易理解,我已经建立一个新的“剥离”项目。我使用了Windows模板工作室(空白,基本的MVVM)。

MainPage.xaml中

<Page 
    x:Class="Test.Views.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:usercontrols="using:Test.Usercontrols" 
    xmlns:toolkit="using:Microsoft.Toolkit.Uwp.UI.Controls" 
    mc:Ignorable="d"> 
    <Grid 
     x:Name="ContentArea" 
     Margin="{StaticResource MediumLeftRightMargin}"> 

     <Grid.RowDefinitions> 
      <RowDefinition x:Name="TitleRow" Height="48"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <TextBlock 
      x:Name="TitlePage" 
      x:Uid="Main_Title" 
      Style="{StaticResource PageTitleStyle}" /> 

     <Grid 
      Grid.Row="1" 
      Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}"> 
      <!--The SystemControlPageBackgroundChromeLowBrush background represents where you should place your content. 
       Place your content here.--> 
      <Grid 
       Grid.Row="0" 
       x:Name="WorkspaceGrid"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition 
         x:Name="Workspace1Column" 
         Width="1*"></ColumnDefinition> 
        <ColumnDefinition 
         x:Name="WorkspaceSplitterColumn" 
         Width="auto"></ColumnDefinition> 
        <ColumnDefinition 
         x:Name="Workspace2Column" 
         Width="1*"></ColumnDefinition> 
       </Grid.ColumnDefinitions> 
       <!--workspace 1--> 
       <usercontrols:MainpageUsercontrol 
        x:Name="WorkspaceUC1" 
        Grid.Column="0"></usercontrols:MainpageUsercontrol> 
       <!--Column Grid Splitter--> 
       <toolkit:GridSplitter 
        x:Name="MainpageGridSplitter" 
        Grid.Column="1" 
        Width="11" 
        ResizeBehavior="BasedOnAlignment" 
        ResizeDirection="Auto" 
        Background="Gray" 
        Foreground="White" 
        FontSize="13"> 
        <toolkit:GridSplitter.Element> 
         <Grid> 
          <TextBlock 
           HorizontalAlignment="Center" 
           IsHitTestVisible="False" 
           VerticalAlignment="Center" 
           Text="&#xE784;" 
           Foreground="Black" 
           FontFamily="Segoe MDL2 Assets"></TextBlock> 
         </Grid> 
        </toolkit:GridSplitter.Element> 
       </toolkit:GridSplitter> 
       <!--workspace 2--> 
       <usercontrols:MainpageUsercontrol 
        x:Name="WorkspaceUC2" 
        Grid.Column="2"></usercontrols:MainpageUsercontrol> 
      </Grid> 
     </Grid> 
    </Grid> 
</Page> 

MainPage.xaml.cs中

using Test.ViewModels; 

using Windows.UI.Xaml.Controls; 

namespace Test.Views 
{ 
    public sealed partial class MainPage : Page 
    { 
     public MainViewModel ViewModel { get; } = new MainViewModel(); 
     public MainPage() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

MainPageViewModel.cs

using System; 

using Test.Helpers; 

namespace Test.ViewModels 
{ 
    public class MainViewModel : Observable 
    { 
     public MainViewModel() 
     { 
     } 
    } 
} 

MainpageUsercontrol.xaml

<UserControl 
    x:Class="Test.Usercontrols.MainpageUsercontrol" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:Test.Usercontrols" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:converter="using:Test.Converters" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400"> 
    <UserControl.Resources> 
     <converter:NullableBoolToBoolConverter 
      x:Key="NullableBoolToBoolConverter" /> 
     <Style 
      x:Key="HamburgerButtonStyle" 
      TargetType="ToggleButton"> 
      <Setter 
       Property="Content" 
       Value="&#xE700;" /> 
      <Setter 
       Property="FontFamily" 
       Value="Segoe MDL2 Assets" /> 
      <Setter 
       Property="FontSize" 
       Value="20" /> 
      <Setter 
       Property="MinHeight" 
       Value="48" /> 
      <Setter 
       Property="MinWidth" 
       Value="48" /> 
     </Style> 
    </UserControl.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition 
       Height="auto"></RowDefinition> 
      <RowDefinition 
       Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <RelativePanel 
      Grid.Row="0" 
      Background="WhiteSmoke"> 
      <ToggleButton 
       x:Name="HamburgerButton" 
       Style="{StaticResource HamburgerButtonStyle}" 
       IsThreeState="False" 
       RelativePanel.AlignBottomWithPanel="True" 
       RelativePanel.AlignTopWithPanel="True" 
       RelativePanel.AlignLeftWithPanel="True" 
       IsChecked="{x:Bind WorkspaceSplitview.IsPaneOpen, Mode=TwoWay, Converter={StaticResource NullableBoolToBoolConverter}}"></ToggleButton> 
     </RelativePanel> 
     <SplitView 
      Grid.Row="1" 
      x:Name="WorkspaceSplitview" 
      IsPaneOpen="False"> 
      <SplitView.Pane> 
       <Grid Background="LightGray"> 
        <Grid.RowDefinitions> 
         <RowDefinition 
          Height="1*"></RowDefinition> 
        </Grid.RowDefinitions> 
        <TextBlock 
         Grid.Row="0" 
         Text="ToDo: Listview Navigation"></TextBlock> 
       </Grid> 
      </SplitView.Pane> 
      <SplitView.Content> 
       <TextBox 
        Background="BlanchedAlmond" 
        Height="60" 
        Width="200" 
        Text="ToDo: Content"></TextBox> 
      </SplitView.Content> 
     </SplitView> 
    </Grid> 
</UserControl> 

MainpageUsercontrol.xaml.cs

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Runtime.InteropServices.WindowsRuntime; 
using Windows.Foundation; 
using Windows.Foundation.Collections; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Controls.Primitives; 
using Windows.UI.Xaml.Data; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Navigation; 

// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 

namespace Test.Usercontrols 
{ 
    public sealed partial class MainpageUsercontrol : UserControl 
    { 
     public MainpageUsercontrol() 
     { 
      this.InitializeComponent(); 
     } 
    } 
} 

NullableBoolToBoolConverter

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.UI.Xaml.Data; 

namespace Test.Converters 
{ 
    public class NullableBoolToBoolConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, string language) 
     { 
      bool? val = (bool?)value; 
      return val.HasValue ? val.Value : false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, string language) => value; 
    } 
} 

的问题:当我点击用户控件的按钮实例1,打开此实例的SPLITVIEW窗格中,但是当我点击然后在实例2的按钮上关闭实例1的分割视图窗格。这是为什么?

我用Google搜索了很多关于在UWP用户控件,但我没有发现任何深入了解他们的工作:

  • 什么封装(事件,属性)?
  • usercontrols如何与调用页面进行通信?
  • 他们如何相互沟通?
  • usercontrol.content如何工作?

希望我不是唯一对usercontrols有点困惑的人。

更新 下图显示单击该按钮之前,活立木: Before

,这表明当拆分窗格已经双头呆活树: After

也许这个“弹出根“是解决方案的一个暗示?

+1

我测试了你的上面的代码片段,但不能重现你上面提到的问题。你能分享一个[mcve]吗? –

+0

我已编辑代码以使其更全面。我希望你现在可以重现这个问题。 谢谢你的帮助。 – user3350279

回答

0

无意中我找到了解决办法:我添加

DISPLAYMODE = “内联”

我的SPLITVIEW。我不知道这是为什么,但我不会抱怨。我只会感激地接受;-)

无论如何:有人能够解释这种行为吗?