我已经使用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元素中。您能否解释原因或提供一些资料来了解这一点?
提前谢谢