<Page x:Class="Project.ProjectDiagramView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:s="clr-namespace:DiagramDesigner"
xmlns:c="clr-namespace:DiagramDesigner.Controls"
mc:Ignorable="d"
d:DesignHeight="850" d:DesignWidth="1000"
Title="Project Diagram">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ContentControl Content="{StaticResource MyToolbar}"/>
<Grid Grid.Row="1" Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="135" MaxWidth="135"/>
<ColumnDefinition Width="*" />
<ColumnDefinition MaxWidth="500" MinWidth="350" />
</Grid.ColumnDefinitions>
<!-- Toolbox -->
<StackPanel Grid.Column="0" Margin="0,0,5,0">
<!--<Expander Header="Symbols" Content="{StaticResource SymbolStencils}" IsExpanded="True"/>-->
</StackPanel>
<!-- GridSplitter -->
<GridSplitter Focusable="False" Width="2" Background="LightGray"
VerticalAlignment="Stretch" HorizontalAlignment="Right"/>
<!-- Designer -->
<GroupBox Header="Diagram" Grid.Column="1" Margin="3,0,3,0">
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<s:DesignerCanvas Focusable="true" x:Name="MyDesigner"
Background="{StaticResource WindowBackgroundBrush}"
Margin="10" FocusVisualStyle="{x:Null}" />
</ScrollViewer>
</GroupBox>
<GroupBox Header="Diagram" Grid.Column="3" Margin="3,0,0,0">
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<s:SelectedDesignItem />
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</Page>
这是我在codeproject中使用的Diagram Designer,上面的代码在第二次加载时会出错
'设置属性'System.Windows.Controls.ContentControl.Content'抛出异常。'行号'24'和行位置'10'。
第一次加载页面时,效果很好,但第二次导航到同一页面时出现错误,我对错误一无所知
我试图评论工具箱,它完美地工作,工具箱没有被处理,我不知道。
请任何人指导我。
谢谢。
答案 0 :(得分:3)
您可以尝试将x:Shared =“False”添加到MyToolbar资源的声明中。这将导致运行时始终创建资源的新实例,而不是重用现有资源。
答案 1 :(得分:2)
您使用的XAML并非设计为两次加载。导致错误的行是ContentControl
将其Content
属性设置为StaticResource
。如您所说,您正在加载它两次,因此有两个ContentControl
实例,但只有一个静态资源实例。 WPF将不允许相同的元素属于两个不同的可视树,因此在第二次加载时,您会收到错误消息,我相信:
指定的元素已经是另一个元素的逻辑子元素
要解决此问题,需要进行大量的返工。一种方法是将内容控件的直接静态内容转换为模板,但不知道应用程序的结构如何,很难说这是否可以轻松工作或只是创建新问题。
答案 2 :(得分:1)
瑞克是对的。
我遇到了完全相同的问题,并使用以下方法来解决它。
基本上,当您导航到该页面时,请保留该页面的记录,然后如果您尝试再次导航到该页面,请首先检查您是否已导航到该页面。如果您已经在页面上,则不执行任何操作,否则导航到该页面。
public partial class MainWindow : Window
{
Uri currentPage;
private void btnNavigateToPage(object sender, MouseButtonEventArgs e)
{
if (currentPage == null)
{
this.Cursor = Cursors.Wait;
frameWorkingArea.Navigate(new Uri("/pgMyPage.xaml", UriKind.RelativeOrAbsolute));
currentPage = frameWorkingArea.Source;
}
if (!currentPage.Equals("/pgMyPage.xaml"))
{
frameWorkingArea.Navigate(new Uri("/pgMyPage.xaml", UriKind.RelativeOrAbsolute));
currentPage = frameWorkingArea.Source;
}
}
}
希望有所帮助。
此致 尼尔