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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 如何实现一个;“无限大”;WPF中的画布效果?_C#_Wpf - Fatal编程技术网

C# 如何实现一个;“无限大”;WPF中的画布效果?

C# 如何实现一个;“无限大”;WPF中的画布效果?,c#,wpf,C#,Wpf,我的目标是创建一个画布,通过在整个画布上移动,您可以将子元素转换到您想要的位置(例如,在rhino的grasshopper插件中)。我尝试使用“translateTransform”,但问题是画布的高度或宽度不够大,无法再次包含整个窗口。我试图解决这个问题,每次拖动画布时,都会向画布添加宽度和高度,但画布的大小似乎没有改变 这是我的window.xaml: <Window x:Name="Window" x:Class="Oolong.Windows.Project.ProjectPlan

我的目标是创建一个画布,通过在整个画布上移动,您可以将子元素转换到您想要的位置(例如,在rhino的grasshopper插件中)。我尝试使用“translateTransform”,但问题是画布的高度或宽度不够大,无法再次包含整个窗口。我试图解决这个问题,每次拖动画布时,都会向画布添加宽度和高度,但画布的大小似乎没有改变

这是我的window.xaml:

<Window x:Name="Window" x:Class="Oolong.Windows.Project.ProjectPlan"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Oolong.Windows.Project"
        mc:Ignorable="d"
        Title="Projektplan" Height="{DynamicResource {x:Static SystemParameters.PrimaryScreenHeightKey}}" Width="{DynamicResource {x:Static SystemParameters.PrimaryScreenWidthKey}}" WindowStartupLocation="CenterOwner" ShowInTaskbar="False" Icon="/Oolong;component/Resources/Images/icon2.png">
    <Window.Background>
        <ImageBrush ImageSource="/Oolong;component/Resources/Images/ui/canvas_bg.png" TileMode="FlipY"      Stretch="Uniform" AlignmentY="Top"  Viewport="0,0,150,50" ViewportUnits="Absolute" />
    </Window.Background>
    <Canvas x:Name="Grid" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" MouseLeftButtonDown="Grid_OnMouseLeftButtonDown" MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp" MouseWheel="Grid_OnMouseWheel" Width="{DynamicResource {x:Static SystemParameters.MaximizedPrimaryScreenWidthKey}}" Height="{DynamicResource {x:Static SystemParameters.MaximizedPrimaryScreenHeightKey}}">
        <Rectangle x:Name="NewTaskRectangle" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="87" Margin="0,0,0,0" Stroke="Black" VerticalAlignment="Top" Width="208" Visibility="Hidden"/>
            <Label x:Name="NewTaskLabel" Content="Gib den Namen der Aufgabe ein..." HorizontalAlignment="Left" Margin="10,17,0,0" VerticalAlignment="Top" Visibility="Hidden"/>
            <TextBox  x:Name="NewTaskTextBox" HorizontalAlignment="Left" Height="23" Margin="10,48,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="189" Visibility="Hidden" KeyUp="NewTaskTextBox_OnKeyUp"/>
            <Border x:Name="NewTaskTemplate" BorderBrush="Black" BorderThickness="2.5" HorizontalAlignment="Left" Height="30" Margin="0" VerticalAlignment="Top" Background="#FFE2C027" Padding="5" Focusable="True" CornerRadius="6" Width="15" Visibility="Hidden" MinWidth="150" MinHeight="30" MouseRightButtonUp="NewTaskTemplate_OnMouseRightButtonUp">
                <Border.ContextMenu>
                    <ContextMenu x:Name="NewTaskContextMenu">
                        <MenuItem x:Name="AddIssueMenuItem" Header="Arbeitsschritt hinzufügen" Click="AddIssueMenuItem_OnClick"/>
                        <MenuItem x:Name="DeleteMenuItem" Header="Löschen" Click="DeleteMenuItem_OnClick"/>
                    </ContextMenu>
                </Border.ContextMenu>
            </Border>
        <Canvas.RenderTransform>
            <TransformGroup>
                <ScaleTransform x:Name="ScaleTransform"/>
                <TranslateTransform x:Name="Tt" />
            </TransformGroup>
        </Canvas.RenderTransform>
    </Canvas>
</Window>

这里是相关的C#代码:

private void NewTaskTemplate_OnMouseRightButtonUp(对象发送器,鼠标按钮ventargs e)
{
点位置=e.GetPosition(网格);
bool haskickedontask=false;
如果(App.ProjectPlan.Tasks!=null)
{
var tasks=App.ProjectPlan.tasks.DistinctBy(task=>task.Position);
变量选择任务=
任务。在哪里(
(任务=>
Math.Abs(task.Position.X-Position.X+10)0)
{
SetGridSize();
}
e、 已处理=正确;
}

画布在一开始是一个网格,但这也不起作用。它可以在画布上移动,当然包括所有元素,但是如果你把它放在窗外,你就不能再移动任何东西了,因为画布已经不在了。我如何处理这个问题,以便用户得到画布是无限的印象?

在这种情况下,每次将拖动的元素放到“网格”外后,您应该使用
滚动视图围绕
网格
,编辑
宽度
高度
属性。大概是这样的:

private void UIElement_OnPreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (canmove) //field is used to define whether element dragged or not
        {
            var c = (Control) sender;
            c.SetValue(Canvas.LeftProperty, e.GetPosition(Canvas).X - p.X);
            c.SetValue(Canvas.TopProperty, e.GetPosition(Canvas).Y - p.Y);

            var leftprop = Convert.ToDouble(c.GetValue(Canvas.LeftProperty));
            if (leftprop > Canvas.Width)
                Canvas.Width = leftprop + c.Width+10;
           
        }
    }

我试图在原始网格周围添加一个网格容器,并触发容器上的事件,但只转换内部网格,但不幸的是,这并不能解决问题,我不知道为什么…因此,您有一个可视区域,它是潜在无限逻辑区域的一部分,您想将元素放置在逻辑区域上,并希望以一种不会将逻辑区域边缘拖入可视区域的方式将其拖动?我不确定是否正确理解您的意思,但如果我这样做,答案是肯定的。。。网格应该可以无限地向右或向左拖动,但是当拖动到窗口的边界时,然后在中间做一个右击,显示网格完全移动到左边或右边,不能在这个鼠标位置上翻译。我可能发现,有一个画布可以解决我的问题。不管怎样,谢谢你的关注……这样,像mousebuttondown这样的事件就不会被触发了anymore@hardking而且,据我所知,你不能没有这些事件?我确实需要这些事件,因为我想创建一个弹出窗口,例如当有人点击canvas@hardking是什么阻止你使用PreviewEvents来达到这个目的?
private void UIElement_OnPreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (canmove) //field is used to define whether element dragged or not
        {
            var c = (Control) sender;
            c.SetValue(Canvas.LeftProperty, e.GetPosition(Canvas).X - p.X);
            c.SetValue(Canvas.TopProperty, e.GetPosition(Canvas).Y - p.Y);

            var leftprop = Convert.ToDouble(c.GetValue(Canvas.LeftProperty));
            if (leftprop > Canvas.Width)
                Canvas.Width = leftprop + c.Width+10;
           
        }
    }