Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# _C#_Wpf - Fatal编程技术网

C#

C# ,c#,wpf,C#,Wpf,//ActiveLocation.xaml <UserControl x:Class="TravianResourceProd.OldLocation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="

//ActiveLocation.xaml

<UserControl x:Class="TravianResourceProd.OldLocation"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="80" Width="80">
    <Grid>
        <Ellipse Stroke="#FF686868" StrokeThickness="8">
            <Ellipse.Fill>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF373737" Offset="1"/>
                    <GradientStop Color="#FF929292"/>
                </LinearGradientBrush>
            </Ellipse.Fill>
        </Ellipse>

    </Grid>
</UserControl>
<UserControl x:Class="TravianResourceProd.ActiveLocation"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="80" Width="80">
    <Grid>
        <Ellipse Stroke="#FF1A9000" StrokeThickness="6">
            <Ellipse.Fill>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF62745E" Offset="1"/>
                    <GradientStop Color="#FF929292"/>
                </LinearGradientBrush>
            </Ellipse.Fill>
        </Ellipse>
        <Button x:Name="btnAddSegment" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="20" Height="22" FontSize="30" Margin="60,30,-0.302,0"/>

    </Grid>
</UserControl>

这里是一个简单的示例,但它展示了在运行时添加和定位控件的一些基础知识

注意事项:

  • 如果希望能够显式定位x,y,请将控件添加到画布
  • 我对位置项使用了UserControls,只是添加了实例
  • 如果你正在构建一个游戏,如果它的大小和复杂度都很大,不要使用WPF。我去过那里,做过,在上面制作了一个完整的多人空间街机/动作游戏。这对游戏来说太慢了
下面是代码转储

//PathBuilding.xaml

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TravianResourceProd" x:Class="TravianResourceProd.PathBuilding"
        Title="PathBuilding" Height="466.377" Width="621.509">
    <Grid x:Name="drawingGrid"  Background="#FFC2C2C2" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="0*"/>
        </Grid.ColumnDefinitions>
        <Canvas Background="#FFB3B3B3" Margin="0,0,0,-0.377" x:Name="DrawCanvas" MouseMove="DrawCanvas_MouseMove" MouseUp="Grid_MouseUp">
            <local:ActiveLocation x:Name="primarySegment" HorizontalAlignment="Left" VerticalAlignment="Top" Loaded="ActiveLocation_Loaded" Canvas.Left="67" Canvas.Top="98"/>

        </Canvas>
    </Grid>
</Window>

//PathBuilding.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace TravianResourceProd
{
    /// <summary>
    /// Interaction logic for PathBuilding.xaml
    /// </summary>
    public partial class PathBuilding : Window
    {
        public PathBuilding()
        {
            InitializeComponent();
            _ConnectorLine = new Line();
            _ConnectorLine.Stroke = new SolidColorBrush(Colors.DarkBlue);
            _ConnectorLine.Visibility = System.Windows.Visibility.Hidden;
            _locationSelector = new LocationOptions();
            _locationSelector.Visibility = System.Windows.Visibility.Hidden;
            DrawCanvas.Children.Add(_ConnectorLine);
            DrawCanvas.Children.Add(_locationSelector);

        }

        private Line _ConnectorLine;
        private bool _AddMode = false;


        private LocationOptions _locationSelector;

        private void ActiveLocation_Loaded(object sender, RoutedEventArgs e)
        {
            primarySegment.btnAddSegment.Click += (object sender1, RoutedEventArgs e1) =>
            {
                //show the type selector
                _locationSelector.Visibility = System.Windows.Visibility.Visible;
                var loc = _locationSelector.TransformToAncestor(drawingGrid)
                          .Transform(new Point(0, 0));
                Canvas.SetLeft(_locationSelector, Mouse.GetPosition(DrawCanvas).X + 80);
                Canvas.SetTop(_locationSelector, Mouse.GetPosition(DrawCanvas).Y - 50);

            };
            _locationSelector.btnTypeOne.Click += (object s, RoutedEventArgs e2) =>
            {
                _AddMode = true;
                _ConnectorLine.Visibility = System.Windows.Visibility.Visible;
                _locationSelector.Visibility = System.Windows.Visibility.Hidden;
            };
        }

        private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (!_AddMode)
                return;
            _AddMode = false;
            _ConnectorLine.Visibility = System.Windows.Visibility.Hidden;

            //Add the one we picked
            var oldLoc = new OldLocation();
            Canvas.SetLeft(oldLoc, Canvas.GetLeft(primarySegment));
            Canvas.SetTop(oldLoc, Canvas.GetTop(primarySegment));
            DrawCanvas.Children.Add(oldLoc);

            //Add a line connecting old to new
            var newestLine = new Line();
            newestLine.Visibility = System.Windows.Visibility.Visible;

            newestLine.Stroke = new SolidColorBrush(Colors.Brown);

            newestLine.X1 = _ConnectorLine.X1;
            newestLine.Y1 = _ConnectorLine.Y1;
            newestLine.X2 = _ConnectorLine.X2 + 40;
            newestLine.Y2 = _ConnectorLine.Y2 + 50;
            DrawCanvas.Children.Add(newestLine);

            //Move the active/primary to the new location
            Canvas.SetLeft(primarySegment, e.GetPosition(this).X);
            Canvas.SetTop(primarySegment, e.GetPosition(this).Y);

        }

        private void DrawCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            try
            {//reposition the line going from active location to mouse
                _ConnectorLine.X1 = Canvas.GetLeft(primarySegment) + 70;
                _ConnectorLine.Y1 = Canvas.GetTop(primarySegment) + 50;
                _ConnectorLine.X2 = e.GetPosition(this).X - 5;
                _ConnectorLine.Y2 = e.GetPosition(this).Y - 5;
            }
            catch (Exception)
            {
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Shapes;
名称空间TravianResourceRod
{
/// 
///PathBuilding.xaml的交互逻辑
/// 
公共部分类PathBuilding:窗口
{
公共道路大厦()
{
初始化组件();
_连接线=新线();
_ConnectorLine.Stroke=新的SolidColorBrush(Colors.DarkBlue);
_ConnectorLine.Visibility=System.Windows.Visibility.Hidden;
_locationSelector=新的LocationOptions();
_locationSelector.Visibility=System.Windows.Visibility.Hidden;
DrawCanvas.Children.Add(_ConnectorLine);
DrawCanvas.Children.Add(_locationSelector);
}
专用线路-连接线;
private bool_AddMode=false;
专用位置选项_位置选择器;
已加载私有void ActiveLocation_(对象发送方,路由目标)
{
primarysecgment.btnAddSegment.Click+=(对象发送者1,路由目标e1)=>
{
//显示类型选择器
_locationSelector.Visibility=System.Windows.Visibility.Visible;
var loc=\u locationSelector.TransformToAncestor(绘图网格)
.变换(新点(0,0));
Canvas.SetLeft(_locationSelector,Mouse.GetPosition(DrawCanvas.X+80);
SetTop(_locationSelector,Mouse.GetPosition(DrawCanvas.Y-50);
};
_locationSelector.btnTypaOne.Click+=(对象s,路由目标e2)=>
{
_AddMode=true;
_ConnectorLine.Visibility=System.Windows.Visibility.Visible;
_locationSelector.Visibility=System.Windows.Visibility.Hidden;
};
}
专用void Grid_MouseUp(对象发送器,MouseButtonEventArgs e)
{
如果(!\u添加模式)
返回;
_AddMode=false;
_ConnectorLine.Visibility=System.Windows.Visibility.Hidden;
//加上我们选的那个
var oldLoc=新的OldLocation();
Canvas.SetLeft(oldLoc,Canvas.GetLeft(primarysecgment));
Canvas.SetTop(oldLoc,Canvas.GetTop(primarysecgment));
DrawCanvas.Children.Add(oldLoc);
//添加一条连接新旧的线
var newestLine=新行();
newestLine.Visibility=System.Windows.Visibility.Visible;
newestLine.Stroke=新的SolidColorBrush(Colors.Brown);
newestLine.X1=_ConnectorLine.X1;
newestLine.Y1=_ConnectorLine.Y1;
newestLine.X2=_ConnectorLine.X2+40;
newestLine.Y2=_ConnectorLine.Y2+50;
DrawCanvas.Children.Add(newestLine);
//将活动/主设备移动到新位置
SetLeft(primarysecgment,e.GetPosition(this.X));
SetTop(primarysecgment,e.GetPosition(this.Y));
}
私有void DrawCanvas_MouseMove(对象发送方,MouseEventArgs e)
{
尝试
{//重新定位从活动位置到鼠标的线
_ConnectorLine.X1=Canvas.GetLeft(主段)+70;
_ConnectorLine.Y1=Canvas.GetTop(主段)+50;
_ConnectorLine.X2=e.GetPosition(this).X-5;
_ConnectorLine.Y2=e.GetPosition(this).Y-5;
}
捕获(例外)
{
}
}
}
}
//LocationOptions.xaml

<UserControl x:Class="TravianResourceProd.LocationOptions"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="109.359" Width="117.057">
    <Grid Margin="0,0,-0.17,0.094">
        <Button x:Name="btnTypeOne" Content="Type One" HorizontalAlignment="Left" VerticalAlignment="Top" Width="117" Height="33" Margin="0,0,-0.17,0"  />
        <Button x:Name="btnTypeTwo" Content="Type Two" HorizontalAlignment="Left" VerticalAlignment="Top" Width="117" Margin="0,38,-0.17,0" Height="33"  />

    </Grid>
</UserControl>

//OldLocation.xaml

<UserControl x:Class="TravianResourceProd.OldLocation"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="80" Width="80">
    <Grid>
        <Ellipse Stroke="#FF686868" StrokeThickness="8">
            <Ellipse.Fill>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF373737" Offset="1"/>
                    <GradientStop Color="#FF929292"/>
                </LinearGradientBrush>
            </Ellipse.Fill>
        </Ellipse>

    </Grid>
</UserControl>
<UserControl x:Class="TravianResourceProd.ActiveLocation"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="80" Width="80">
    <Grid>
        <Ellipse Stroke="#FF1A9000" StrokeThickness="6">
            <Ellipse.Fill>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF62745E" Offset="1"/>
                    <GradientStop Color="#FF929292"/>
                </LinearGradientBrush>
            </Ellipse.Fill>
        </Ellipse>
        <Button x:Name="btnAddSegment" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="20" Height="22" FontSize="30" Margin="60,30,-0.302,0"/>

    </Grid>
</UserControl>

//ActiveLocation.xaml

<UserControl x:Class="TravianResourceProd.OldLocation"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="80" Width="80">
    <Grid>
        <Ellipse Stroke="#FF686868" StrokeThickness="8">
            <Ellipse.Fill>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF373737" Offset="1"/>
                    <GradientStop Color="#FF929292"/>
                </LinearGradientBrush>
            </Ellipse.Fill>
        </Ellipse>

    </Grid>
</UserControl>
<UserControl x:Class="TravianResourceProd.ActiveLocation"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="80" Width="80">
    <Grid>
        <Ellipse Stroke="#FF1A9000" StrokeThickness="6">
            <Ellipse.Fill>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF62745E" Offset="1"/>
                    <GradientStop Color="#FF929292"/>
                </LinearGradientBrush>
            </Ellipse.Fill>
        </Ellipse>
        <Button x:Name="btnAddSegment" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="20" Height="22" FontSize="30" Margin="60,30,-0.302,0"/>

    </Grid>
</UserControl>


这太棒了!帆布的使用完全符合我的需要。我需要一点时间来理解这里的一切,比如用户控件。没有遇到我们这些人。但除此之外,这正是我所需要的,谢谢。我使用UserControls是因为我太懒了,无法在MsPaint中创建图像。您可以在其中抛出一个图像控件,然后设置图像源。使用椭圆/矩形/直线等形状类型进行本机绘制的一个好处是基于矢量的渲染WPF,因此它可以上下缩放,而不会丢失质量。这太神奇了!帆布的使用完全符合我的需要。我需要一点时间来理解这里的一切,比如用户控件。没有遇到我们这些人。但是