首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可锚固设备的装载和保存布局.可见性的装订

可锚固设备的装载和保存布局.可见性的装订
EN

Stack Overflow用户
提问于 2016-08-16 11:56:49
回答 1查看 1.5K关注 0票数 21

我面临的问题是,在加载我的旧布局之后,我无法打开X类型的可播性。只有当我在保存布局之前关闭X类型的可选性时,才会发生这种情况。

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

密码

视图

我在视图中的Loaded事件中加载可锚定的DockingManager的保存的布局(= tool窗口),如下所示(简化):

代码语言:javascript
运行
复制
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);
});

我在视图中的Closing事件中保存可锚定项的当前布局,如下所示(简化):

代码语言:javascript
运行
复制
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与XAML中的ViewModel绑定如下(简化):

代码语言:javascript
运行
复制
<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>
[...]

ViewModel

在ViewModel of MainWindow中打开了“可播性”。以下是消息的示例代码:

代码语言:javascript
运行
复制
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;
    // [...]
}

只要让我知道,如果你需要更多的信息,或我是否错过了添加一些代码!

EN

Stack Overflow用户

发布于 2018-05-23 17:39:55

也许我误解了你的问题但是..。IsActive属性不用于打开保存到布局中的工具。该属性用于将工具设置为活动(聚焦)。为了打开保存到布局中的工具,您应该处理附加如下内容的layoutSerializer_LayoutSerializationCallback

代码语言:javascript
运行
复制
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    
        }
    }
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38974314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档