-1

我想在屏幕上获得一个 XAML 指定的界面,这样我就可以学习 WPF。但我不想从一个已经完成所有连接的视觉工作室项目开始。我不希望从“main()”函数在屏幕上绘制 xaml 文件中指定的窗口的 c#“hello world”等价物。

那么如何将 XAML 文件连接到对象并从控制台应用程序将其绘制在屏幕上呢?请同时连接一个简单的事件。说一个“hello world”按钮(在 xaml 中指定),按下该按钮会使控制台打印“hello world”。我希望通过以下方式查看委托功能。

  1. XAML 中作为内联 c# 的逻辑。
  2. 在与“main()”方法相同的文件中指定的逻辑,作为一个自由函数(编辑:哦,等等,c# 没有自由函数,以及某种不是代码隐藏的委托)。
  3. 作为对象的成员函数的逻辑,我相信该对象是 XAML 的代码隐藏(当然假设这种在 xaml 和 c# 对象之间映射的方式是可能的)。

另外:这个答案显示了 ui runloop 接管了主线程,是否有任何糖可以为应用程序创建一个新线程,这样它就不会阻塞被调用者?

如果您想知道我为什么要问这个问题,或者为什么我想以这种方式学习 WPF。我想从没有其他显示信息的插件中触发临时 UI 元素。


对于那些觉得这个问题太模糊的人,这里有一个 xaml 的例子

<Canvas xmlns="http://schemas.microsoft.com/client/2007"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <TextBlock>Hello World!</TextBlock>
</Canvas>

这个问题的主要应用程序是一个控制台 c# 应用程序,XAML 文件表示一个带有单个按钮的表单,按下按钮会向控制台打印“hello world”。而且我想看看将按钮连接到我的代码的不同方式,我不明白我怎么能更清楚。

4

2 回答 2

4

冒着被告知这不是您所要求的风险,但由于不清楚:

class WpfSample
{
    [STAThread]
    public static void Main()
    {
        var window = new Window()
        {
            Title = "WPF",
            Width = 640,
            Height = 480
        };

        var grid = new Grid();

        var button = new Button()
        {
            Content = "Click Me",
            Width = 100,
            Height = 50,

        };

        grid.Children.Add(button);
        window.Content = grid;

        button.Click += (s, e) =>
        {
            MessageBox.Show("You clicked me");
        };

        window.ShowDialog();

    }
}

话虽这么说,如果您想要为您的 WPF 应用程序添加插件,那么这样做(全部使用代码)并不是要走的路。

我们在插件中定义控件,而不需要将它们全部连接到代码中,为此我们使用 MEF。

更新 要从您存储在某处的某些 XAML 加载 UI,您可以使用 ValueConverter

public class StringToXamlValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string xaml;
        if (value != null && !String.IsNullOrWhiteSpace(value.ToString))
        {
            xaml = value.ToString();
        }
        else
        {
            xaml = Settings.Default.DefaultLayoutView;
        }

        var root = XamlReader.Parse(xaml);
        return root;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后,您将像这样设置某些元素的内容:

<ContentControl Content="{Binding Layout.View, Converter={StaticResource StringToXamlConverter}}"/>
于 2012-12-05T02:34:16.507 回答
1

直截了当:

我想从没有其他显示信息的插件中触发临时 UI 元素。

绝对不需要从头开始绘制窗口,而是可以在对象上使用该ShowDialog()方法:Window

var myWindow = new Window();
myWindow.ShowDialog();

当然,您可以以编程方式将所需的任何控件添加到该窗口,或者您可以将其定义为 XAML,然后您将其重新水合为窗口。

话虽如此,理想情况下,插件的主机应该为您提供一个容器,您可以向其中添加内容(或提供您手动滚动的对话服务),而不是您必须直接从插件中强制显示内容。

于 2012-12-05T02:27:01.650 回答