gpt4 book ai didi

c# - 加载和保存 anchor 布局 - 可见性绑定(bind)

转载 作者:可可西里 更新时间:2023-11-01 08:29:56 24 4
gpt4 key购买 nike

我遇到的问题是,在加载旧布局后,我无法打开类型 X 的 anchor 。只有当我在保存布局之前关闭了类型 X 的可锚定时才会发生这种情况。

有没有人对AvalonDock有类似的问题? ?这是 AvalonDock 的错误吗?经过多年的调试,我担心绑定(bind) <Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/>更改时未在 View 中正确更新 IsActive在 View 模型中。 AvalonDock 应该负责这个任务。但也许问题出在布局的加载和保存上?

代码

查看

我正在 Loaded 中加载我的 anchor (= 工具窗口)的已保存布局我的事件 DockingManager 在我看来是这样的(简化):

string savedLayout = Properties.Settings.Default.Layout;
XmlDocument doc = new XmlDocument();
doc.LoadXml(savedLayout);

// very simplified code. load saved xml layout and add anchorables to the dockmanager
doc.SelectNodes("//LayoutAnchorable").OfType<XmlNode>().ToList().ForEach(anchorable =>
{
this.DockManager.AnchorablesSource.Add(anchorable);
});

我将 anchor 的当前布局保存在 Closing 中我的事件 MainWindow 在我看来是这样的(简化):

XmlDocument doc = new XmlDocument();
XmlLayoutSerializer xmlLayoutSerializer = new XmlLayoutSerializer(this.DockManager);

using (MemoryStream stream = new MemoryStream())
{
xmlLayoutSerializer.Serialize(stream);
stream.Seek(0, SeekOrigin.Begin);
doc.Load(stream);
}
// here happens some magic. i think this code is not responsible for my problem
Properties.Settings.Default.Layout = doc.OuterXml;

ViewModel 像这样(简化)绑定(bind)到 XAML 中的 ViewModel:

<xcad:DockingManager x:Name="DockManager" AnchorablesSource="{Binding Tools}" Loaded="DockManager_Loaded">
<xcad:DockingManager.LayoutItemContainerStyle>
<Style TargetType="{x:Type dockctrl:LayoutItem}">
<Setter Property="Title" Value="{Binding Model.ContentId}" />
<Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}" />
<Setter Property="CanClose" Value="{Binding Model.CanClose, Mode=TwoWay}" />
<Setter Property="Visibility" Value="{Binding Model.IsVisible, Mode=TwoWay, Converter={StaticResource Bool2vis}, ConverterParameter={x:Static Visibility.Hidden}}"/>
<Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
<Setter Property="IconSource" Value="{Binding Model.IconSource}" />
<Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/>
<Setter Property="ContentId" Value="{Binding Model.ContentId}" />
</Style>
</xcad:DockingManager.LayoutItemContainerStyle>
[...]

View 模型

anchorable 在 MainWindow 的 ViewModel 中打开。以下是消息的示例代码:

public ObservableCollection<ToolBoxViewModelBase> Tools { get; } = new ObservableCollection<ToolBoxViewModelBase>();

public MainWindowViewModel()
{
// [...]
this.MessagesWindow = new MessagesWindowViewModel();
SimpleIoc.Default.Register<MessagesWindowViewModel>(() => this.MessagesWindow);
this.ShowMessagesWindowCommand = new RelayCommand(() => this.OpenToolBox(this.MessagesWindow));
// [...]
}

public void OpenToolBox<T>(T viewModel) where T : ToolBoxViewModelBase
{
// [...]
viewModel.IsVisible = true;
viewModel.IsActive = true;
// [...]
}

如果您需要更多信息或者我是否错过了添加一些代码,请告诉我!

最佳答案

也许我误解了你的问题但是... IsActive 属性不用于打开保存到布局中的工具。该属性用于将工具设置为事件(聚焦)。为了打开保存到布局中的工具,您应该处理附加的 layoutSerializer_LayoutSerializationCallback像这样:

var layoutSerializer = new XmlLayoutSerializer(this.DockManager);
layoutSerializer.LayoutSerializationCallback += layoutSerializer_LayoutSerializationCallback;

protected virtual void layoutSerializer_LayoutSerializationCallback(object sender, LayoutSerializationCallbackEventArgs e)
{
try
{
var model = this.Docs.Union(this.Tools).FirstOrDefault(vm => vm.ContentId == e.Model.ContentId);
if (model != null)
{
e.Content = model;
}
else
{
// Log load layout error info
}
}
catch (Exception ex)
{
// Log load layout error info
}
}

关于c# - 加载和保存 anchor 布局 - 可见性绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38974314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com