WPF XAML Hello World从头开始,与代表一起

时间:2012-12-05 01:59:28

标签: c# .net wpf xaml user-interface

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

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

  1. XAML中的内联c#逻辑。
  2. 在与“main()”方法相同的文件中指定的逻辑,作为自由函数(编辑:哦等待c#没有自由函数,以及某种不是代码隐藏的代理)。
  3. 逻辑作为对象的成员函数,我相信该对象是XAML的代码隐藏(假设这种方式可以在xaml和c#对象之间进行映射)。
  4. 另外:This answer显示ui runloop接管主线程,是否有任何糖为应用程序创建一个新线程,所以它不会阻止被调用者?

    如果你想知道为什么我问这个问题,或者为什么我想用这种方式学习WPF。我想从一个没有其他显示信息的插件中触发ad-hoc 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#app,XAML文件代表一个带有单个按钮的表单,按下按钮将“hello world”打印到控制台。我希望看到将按钮连接到我的代码的不同方式,我不明白我怎么能更清楚。

2 个答案:

答案 0 :(得分: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}}"/>

答案 1 :(得分:1)

直截了当地说:

  

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

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

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

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

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