Используется элемент управления Avalondock, предоставляемый Exceed через NuGet в приложении WPF. Я подключил операции show и hide к кнопке, чтобы переключить видимость LayoutAnchorable. После загрузки приложения сначала все работает как положено. После применения макета невозможно выполнить операцию переключения для изменения видимости.
Наблюдения
макет с применением логики c помещается в конструктор класса управления сразу после InitializeComponent. Затем не удалось выполнить операцию переключения. Это даже не приводит к исключению. Я клонировал исходный код Avalondock, добавил его в свой проект, немного отладил и обнаружил, что сразу после применения события layout в классе LayoutAnchrable становится пустым. В дополнение к этому, свойство Manager поверх Parent свойство в текущем классе также становится нулевым. Понятия не имею, почему он ведет себя так, что там тоже нет подозрительного кода.
public MainWindow()
{
InitializeComponent();
using (_xmlReader = XmlReader.Create("layout.xml"))
{
var layoutSerializer = new XmlLayoutSerializer(dock);
layoutSerializer.Deserialize(_xmlReader);
}
}
Теперь макет с применением логики c помещен в кнопку применить макет ко всему элементу управления Avalondock сразу после нажатия кнопки. тогда исключение
Ссылка на объект не установлена на экземпляр объекта
наблюдается сразу после выполнения операции переключения.
private void OnApplyLayout(object sender, RoutedEventArgs e)
{
var layoutSerializer = new XmlLayoutSerializer(dock);
layoutSerializer.Deserialize("layout.xml");
dock.UpdateLayout();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (group1.IsHidden)
{
group1.Show();
}
else
{
group1.Hide();
}
}
XAML код
<avalonDock:DockingManager x:Name="dock" Grid.Row="1">
<avalonDock:LayoutRoot x:Name="layoutRoot">
<avalonDock:LayoutPanel>
<avalonDock:LayoutAnchorablePane>
<avalonDock:LayoutAnchorable Title="OneAnchorable">
<Button Content="Click" />
</avalonDock:LayoutAnchorable>
</avalonDock:LayoutAnchorablePane>
<avalonDock:LayoutDocumentPane>
<avalonDock:LayoutDocument x:Name="docg1" ContentId="Doc1">
<Button Content="Document Pane" />
</avalonDock:LayoutDocument>
</avalonDock:LayoutDocumentPane>
<avalonDock:LayoutDocumentPaneGroup>
<avalonDock:LayoutDocumentPane x:Name="docPane">
<avalonDock:LayoutDocument x:Name="docGroup1" ContentId="document1" Title="Document 1" >
<Button Content="Document 1 Content" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</avalonDock:LayoutDocument>
<avalonDock:LayoutDocument x:Name="docGroup2" ContentId="document2" Title="Document 2" >
<TextBox Text="Document 2 Content" AcceptsReturn="True"/>
</avalonDock:LayoutDocument>
</avalonDock:LayoutDocumentPane>
</avalonDock:LayoutDocumentPaneGroup>
<avalonDock:LayoutAnchorablePaneGroup x:Name="aPaneGroup" DockWidth="125">
<avalonDock:LayoutAnchorablePane>
<avalonDock:LayoutAnchorable x:Name="group1" ContentId="alarms" Title="Alarms" >
<ListBox x:Name="ls">
<s:String>Alarm 1</s:String>
<s:String>Alarm 2</s:String>
<s:String>Alarm 3</s:String>
</ListBox>
</avalonDock:LayoutAnchorable>
<avalonDock:LayoutAnchorable x:Name="group2" ContentId="journal" Title="Journal" >
<RichTextBox>
<FlowDocument>
<Paragraph FontSize="14" FontFamily="Segoe">
This is the content of the Journal Pane.
<LineBreak/>
A
<Bold>RichTextBox</Bold> has been added here
</Paragraph>
</FlowDocument>
</RichTextBox>
</avalonDock:LayoutAnchorable>
</avalonDock:LayoutAnchorablePane>
</avalonDock:LayoutAnchorablePaneGroup>
</avalonDock:LayoutPanel>
</avalonDock:LayoutRoot>
</avalonDock:DockingManager>