C# 如何创建WPF交互式应用程序巡更

C# 如何创建WPF交互式应用程序巡更,c#,.net,wpf,C#,.net,Wpf,我有一个WPF Windows应用程序,我想添加交互式演练,以帮助用户了解如何使用该应用程序 我想为网站添加类似的内容: 有没有一种方法可以为WPF做到这一点???我不知道是否有专门用于您的工具存在,但我认为您可以自己编写代码。这并不难 您可以从这个简单的示例中获得想法。我使用了控件-您可以在库中找到它) 现在让我们看看XAML代码: <Window x:Class="WpfApplication1.MainWindow" Name="win" xmlns="http://

我有一个WPF Windows应用程序,我想添加交互式演练,以帮助用户了解如何使用该应用程序

我想为网站添加类似的内容:


有没有一种方法可以为WPF做到这一点???

我不知道是否有专门用于您的工具存在,但我认为您可以自己编写代码。这并不难

您可以从这个简单的示例中获得想法。我使用了控件-您可以在库中找到它)

现在让我们看看XAML代码:

<Window x:Class="WpfApplication1.MainWindow" Name="win"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"
        Title="MainWindow" Height="600" Width="600">

    <Grid>
        <StackPanel Margin="0, 200, 200, 0">
            <TextBox Margin="10" Name="TextBox" />
            <CheckBox Content="Flag" Margin="10" Name="CheckBox"
                      Width="70" HorizontalAlignment="Left" />
            <Button Content="Click Me" Margin="10" Name="Button" />
            <ComboBox Margin="10" Name="ComboBox">
                <sys:String>Item 1</sys:String>
                <sys:String>Item 2</sys:String>
                <sys:String>Item 3</sys:String>
            </ComboBox>
            <Button Name="Start" Content="Start Tour" Margin="10" Click="StartTour" />

        </StackPanel>

        <ed:Callout Name="Callout" Fill="LightYellow"
                    Width="200"
                    Height="100"
                    HorizontalAlignment="Left"
                    VerticalAlignment="Top"
                    CalloutStyle="Oval"
                    Stroke="Black"
                    Visibility="Hidden" Panel.ZIndex="100">
            <StackPanel Orientation="Vertical">
                <TextBlock Name="CalloutMessage" Margin="5" TextWrapping="Wrap" />
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <Button Content="Ok" Click="Ok" Margin="1" />
                    <Button Content="Cancel" Click="Cancel" Margin="1" />
                </StackPanel>
            </StackPanel>
        </ed:Callout>
    </Grid>

</Window>
当然,此示例与MVVM不兼容。无论如何,我想用MVVM的方式来改变它并不需要很大的努力

我希望此示例可以帮助您,并为您的工作提供一些提示。

您可以查看。它是一个类似于TourMyApp的工具,但更易于使用,并具有许多有用的功能

使用它,您可以轻松地在任何web应用程序上无缝创建交互式演练


它适用于所有web应用程序或网站。您可以使用Chrome或Firefox的Whatfix编辑器创建交互式演练。创建后,可以在所有web浏览器上查看演练。

是的,您肯定可以使用wpf来完成此操作,但您可能需要编写大量代码,因为我怀疑您是否会找到用于此的库。不知道是否存在帮助构建此类toturial的工具,但这是可能的,就像在web上一样,您可以设置z索引并将turial视图放在应用程序的顶部。实际上,有一个库正好支持这一点:!大揭露:我是那个图书馆的创造者。
using System;
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Media;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private NameValueCollection tourData = new NameValueCollection();
        private int currentIndex;

        public MainWindow()
        {
            InitializeComponent();

            tourData.Add("TextBox", "This is a TextBox");
            tourData.Add("Button", "This is a Button. You can click it");
            tourData.Add("CheckBox", "This is a CheckBox");
            tourData.Add("ComboBox", "This is a ComboBox. You can select an item");

        }

        private void MoveCallout(FrameworkElement element, string message)
        {
            GeneralTransform generaTransform = element.TransformToAncestor(this);
            Point point = generaTransform.Transform(new Point(0, 0));

            double x = point.X + element.ActualWidth + 4;
            double y = point.Y + element.ActualHeight + 4;

            CalloutMessage.Text = message;
            Callout.RenderTransform = new TranslateTransform(x, y);
        }

        private void StartTour(object sender, EventArgs args)
        {
            currentIndex = 0;
            Callout.Visibility = System.Windows.Visibility.Visible;
            Start.IsEnabled = false;

            FrameworkElement element = (FrameworkElement)FindName(tourData.GetKey(currentIndex));
            MoveCallout(element, tourData.Get(currentIndex));

            currentIndex++;
        }

        private void Ok(object sender, EventArgs args)
        {
            FrameworkElement element;
            if (currentIndex < tourData.Count)
            {
                element = (FrameworkElement)FindName(tourData.GetKey(currentIndex));
                MoveCallout(element, tourData.Get(currentIndex));

                currentIndex++;
            }
            else
            {
                Callout.Visibility = System.Windows.Visibility.Hidden;
                Start.IsEnabled = true;
            }

        }

        private void Cancel(object sender, EventArgs args)
        {
            Callout.Visibility = System.Windows.Visibility.Hidden;
            Start.IsEnabled = true;
        }
    }
}