初心者として、私はautorsのためのアプリケーションを開発しようとしています。ワークスペースページには2つの列があるグリッドがあります。これらの列(単一または両方)の可視性は、ラジオボタンによって制御されます。各列には、WorkspaceUsercontrolのインスタンスが保持されます。
このusercontrolのsplitviewペインには、章、シーンなどが保持されます。コンテンツは異なるタイプ(テキスト、画像、HTMLなど)のリストビュー項目で満たされます。リストビュー項目をあるインスタンスから他のbeiドラッグ、ので、1つのインスタンスの変更は、他のインスタンスに反映される必要があります。これはこれまでのコードです:ユーザーコントロールの2つのインスタンス
EDIT 私はもっと分かりやすくするために、新しい "ストリップされた"プロジェクトを作成しました。私はWindows Template Studio(空の基本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=""
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="" />
<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のsplitviewペインが閉じます。なぜこれはそうですか?
私はUWPでのUserControlについて多くをグーグルが、私は深く、彼らがどのように機能するかを理解するために何かを見つけることができませんでした:
- (イベント、プロパティ)カプセル化されていますか?
- usercontrolはどのように呼び出しページと通信しますか?
- どのようにお互いに通信しますか?
- usercontrol.contentはどのように機能しますか?
うまくいけば、私はusercontrolsについてちょっと混乱している唯一の人ではないでしょうか。
更新 次の画像ボタンをクリックする前に、ライブツリーを示しています
とスプリットペインがopenendたときは、このライブツリーを示していますたぶんこの「ポップアップルートを"解決へのヒントは何ですか?
上記のコードスニペットをテストしましたが、上記の問題を再現できません。あなたは[mcve]を共有していただけますか? –
私はより包括的にするためにコードを編集しました。私はあなたが今問題を再現できることを願っています。 ありがとうございます。 – user3350279