2

我有一个使用列表视图树进行导航的 WPF 应用程序。在这棵树中,我有一个对象类型列表,因此类似于:

+Domain
-Process
  -Procedure
    -Task
      -Object Name - Types

右侧每个对象名称旁边是一个编辑图标。我想做的是根据对象类型在对象名称的左侧添加一个图标。对象类型可以是单选按钮、组合框等。我的对象类型来自数据库,这很好。我的问题是我动态创建了这棵树。所以我使用了 FrameworkElementFactory,这样我就可以在每个对象名称旁边添加一个堆栈面板,然后在每个对象名称旁边放置一个编辑按钮。希望这是有道理的。

到目前为止,我尝试的是图像部分:

DataTemplate dataTemp = new DataTemplate();

//create stack panel and text block

FrameworkElementFactory stkPanel = new FrameworkElementFactory(typeof(StackPanel));

FrameworkElementFactory txtBlock = new FrameworkElementFactory(typeof(TextBlock));

FrameworkElementFactory img = new FrameworkElementFactory(typeof(Image));

Image imgIcon = new Image();

BitmapImage bi = new BitmapImage();

//set value of text block to the object name of the tree

txtBlock.SetValue(TextBlock.TextProperty, taskObjectRow["ObjectName"].ToString());

string objectType;

objectType = taskObjectRow["Type"].ToString();

if (objectType.ToString() == "RadioGroup")
{

    bi.UriSource = new Uri("Radiobutton.ico");

    imgIcon.Source = bi;

    img.SetValue(Image.SourceProperty,imgIcon);

}

////set the orientation of text in the stake panel to horizontal

stkPanel.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
                                        FrameworkElementFactory editTreeBtn =new 

FrameworkElementFactory(typeof(editTreeButton));


editTreeBtn.SetValue(editTreeButton.ObjectIDProperty,taskObjectRow["ObjectID"]);

//append txt block and user control to the stack panel

stkPanel.AppendChild(txtBlock);

stkPanel.AppendChild(img);

stkPanel.AppendChild(editTreeBtn);

//add stkPanel to data template

dataTemp.VisualTree = stkPanel;

当我尝试使用位图方法时,我收到一个错误,我无法创建 Window1 的实例,这是我的 WPF 应用程序。我要做的就是确定对象类型是什么,然后根据它动态设置图标图像。我只是没有想法,有没有其他方法可以使用这种方法来实现这一点?


只是一个更新,我终于克服了应用程序崩溃,更新后的代码是这样的:

var img = new FrameworkElementFactory(typeof(Image));

BitmapImage bi = new BitmapImage();

//set value of text block to the object name of the tree

txtBlock.SetValue(TextBlock.TextProperty, 
                  taskObjectRow["ObjectName"].ToString());

var objectType = taskObjectRow["Type"].ToString();

if (objectType.ToString() == "Combobox")    
{

bi.BeginInit();    
bi.UriSource = new Uri(@"Combobox.ico", UriKind.Relative);    
bi.EndInit();

//Uri uri = new Uri("Combobox.ico", UriKind.Relative);    
//Image imgTest = new Image();    
//ImageSource imgSource = new BitmapImage(uri);    
//imgTest.Source = imgSource;

img.SetValue(Image.SourceProperty, bi);    
img.SetValue(Image.VisibilityProperty, Visibility.Visible);

}

但是,该图标现在不显示。有谁知道为什么?

4

1 回答 1

0

尝试这样的事情:

BitmapImage bmpImg = new BitmapImage(new Uri("pack://application:,,,<AssemblyName>;component/<Path>/<ImageFilename>");

在哪里

<AssemblyName> is the name of the assembly
<Path> is the path to the image within the project
<ImageFilename> is the name of the image with the extension

然后你可以这样做:

img.SetValue(Image.SourceProperty, bmpImg);

于 2011-02-09T00:31:16.233 回答