WPF View正在提供错误

时间:2011-05-13 04:55:37

标签: c# .net wpf view

<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'。

第一次加载页面时,效果很好,但第二次导航到同一页面时出现错误,我对错误一无所知

我试图评论工具箱,它完美地工作,工具箱没有被处理,我不知道。

请任何人指导我。

谢谢。

3 个答案:

答案 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;
        }
    }
}

希望有所帮助。

此致 尼尔