运行时生成的图像(.gif)未显示在WPF UI的Image元素中

时间:2018-12-12 08:24:53

标签: wpf

我已经使用ANTLR4制作了一个解析器,该解析器构建语法树并在运行时(使用Graphviz)在.gif文件中生成其视觉表现形式。我想在UI的图像元素中显示此.gif文件,以响应ParseGrammar按钮的单击。所以我在处理程序中使用以下代码,除非我删除image.CacheOption = BitmapCacheOption.OnLoad;线。在这种情况下,语法树不会在Image元素中显示,而不会产生任何异常。

string gifFilename = Facade.MTestBenchDirectory + "SyntaxTree" + ".gif";
BitmapImage image = new BitmapImage();
Facade.ParseGrammar(m_grammarFilename);
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource =new Uri(gifFilename,UriKind.Relative);
image.EndInit();
imageSyntaxTree.Source = image;

如果我删除了该行,则.gif文件不会显示在Image元素中。在下面,您可以看到我使用的XAML代码,其中Image元素位于代码的最后几行。

<Window x:Class="UOPBisonUI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:UOPBisonUI"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid Background="LightGray">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <Menu Grid.Row="0">
        <MenuItem Header="_File">
            <MenuItem Header="_Open" Click="OpenMenuItem_Click" />
            <MenuItem Header="_Save" Click="SaveMenuItem_Click"/>
            <MenuItem Header="_Close"/>
            <Separator />
            <MenuItem Header="_Exit"/>
        </MenuItem>
        <MenuItem Header="_Run">
            <MenuItem Header="_Parse Grammar" Click="ParseGrammarMenuItem_Click"></MenuItem>
        </MenuItem>
        <MenuItem Header="_Help">
            <MenuItem Header="_About"/>
        </MenuItem>
    </Menu>
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBox Grid.Column="0" Margin="5" Name="grammarEditorTextBox"
              VerticalScrollBarVisibility="Auto" Grid.ColumnSpan="3"
                 AcceptsReturn="True" AcceptsTab="True"/>
        <Grid Grid.Column="1">
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.LayoutTransform>
                <ScaleTransform CenterX="0"
                                CenterY="0"
                                ScaleX="{Binding ElementName=zoomSlider, Path=Value}"
                                ScaleY="{Binding ElementName=zoomSlider, Path=Value}"/>
            </Grid.LayoutTransform>
            <ScrollViewer Grid.Row="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                <Image  Name="imageSyntaxTree"></Image>
            </ScrollViewer>
            <Slider Grid.Row="1"
                    Name="zoomSlider"
                    Value="2"
                    Minimum="0.1"
                    Maximum="4"/>
        </Grid>            
    </Grid>
</Grid>

我进行了很多搜索,没有针对此简单问题的明确解释。那就是为什么image.CacheOption = BitmapCacheOption.OnLoad;行是语法树加载时必需的,并在运行时显示在Image元素中。您能否解释原因或提供一些资料来了解这一点?

提前谢谢

0 个答案:

没有答案