繁体   English   中英

WPF XAML Hello World从零开始,并有代表

[英]WPF XAML Hello World from scratch, with delegates

我想在屏幕上获取XAML指定的界面,以便可以学习WPF。 但是我不想从已经完成所有连线的Visual Studio项目开始。 我不希望c#“ hello world”等同于在屏幕上通过“ main()”函数在xaml文件中指定一个窗口。

那么,如何将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”。 而且我想了解将按钮连接到代码的不同方式,但我不知道如何更清晰。

冒被告知的危险不是您要的,但由于不清楚:

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}}"/>

切入要点:

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

绝对没有任何需要画一个从无到有的窗口,而不是可以使用ShowDialog()方法的Window对象:

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

当然,你可以编程任何你想要的控件添加到该窗口,或者你可以有它已被定义为XAML的地方,你再重新水合物作为一个窗口。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM