簡體   English   中英

用戶定義的表單,wpf綁定控制位置

[英]User defined form, wpf binding controls position

我試圖讓用戶設計自己的表單並將控件位置保存到數據庫中。 現在,我能夠允許用戶生成新控件並在表單中移動它們。 我不知道如何將控件的位置放到我的Datacontext中。 我只能綁定寬度etd ...

我希望可以將canvas.left和canvas.top綁定到datacontext,但是不會在renderTransform上更新它們。

有任何想法嗎?謝謝您的幫助。

這是用於移動控件的后退代碼:

        private Control _currentlyDragged;

        private Point _currentlyDraggedMouseOffset;

        private void Window_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (_currentlyDragged != null)
            {
                var mousePos = e.GetPosition(this);
                var futurePos = e.GetPosition(BuildCanvas);

                if (futurePos.X <= 0 || futurePos.Y <= 0 || futurePos.Y >= BuildCanvas.ActualHeight || futurePos.X >= BuildCanvas.ActualWidth)
                    return;

                _currentlyDragged.RenderTransform = new TranslateTransform(mousePos.X - _currentlyDraggedMouseOffset.X, mousePos.Y - _currentlyDraggedMouseOffset.Y);
            }
        }

        private void Window_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (_currentlyDragged != null)
                _currentlyDragged = null;

            ReleaseMouseCapture();
        }

        private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Point pt = e.GetPosition((UIElement)sender);
            _hitResultsList.Clear();

            VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(MyHitTestResult), new PointHitTestParameters(pt));

            if (!_hitResultsList.Where(h => h is Border && ((Border)h).Name == "BuildCanvas").Any())
                return;

            if (_hitResultsList.Count > 0)
            {
                foreach (DependencyObject d in _hitResultsList)
                {
                    var parent = VisualTreeHelper.GetParent(d);

                    if (parent != null && (parent is Label || parent is TextBox))
                    {
                        CaptureMouse();

                        _currentlyDragged = parent as Control;

                        if (_currentlyDragged.RenderTransform is TranslateTransform)
                        {
                            _currentlyDraggedMouseOffset.X = e.GetPosition(this).X - ((TranslateTransform)_currentlyDragged.RenderTransform).X;
                            _currentlyDraggedMouseOffset.Y = e.GetPosition(this).Y - ((TranslateTransform)_currentlyDragged.RenderTransform).Y;
                        }
                        else
                        {
                            _currentlyDraggedMouseOffset.X = pt.X;
                            _currentlyDraggedMouseOffset.Y = pt.Y;
                        }
                        return;
                    }
                }
            }
            _currentlyDragged = null;
        }

        private HitTestResultBehavior MyHitTestResult(HitTestResult result)
        {
            _hitResultsList.Add(result.VisualHit);
            return HitTestResultBehavior.Continue;
        }

這是ItemsControl:

    <Border x:Name="BuildCanvas" Grid.Column="1" Grid.Row="0" Background="#fff4c9" CornerRadius="10">
        <Grid>
            <!-- Generated controls -->
            <ItemsControl ItemsSource="{Binding TextBoxCollection}" Panel.ZIndex="1">

                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>

                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBox HorizontalAlignment="Left" VerticalAlignment="Top" Padding="2" IsEnabled="False" Background="White"
                                 Text="{Binding Name, Mode=OneWay}" Width="{Binding Width}">
                        </TextBox>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <!-- -->
        </Grid>
    </Border>

Rendertransform是個壞主意。 每個文本框都在一個容器中。

您應該綁定itemcontainer的Canvas.Top和Canvas.Left。 就像是:

<ItemsControl.ItemContainerStyle>
    <Style>
        <Setter Property="Canvas.Left" Value="{Binding XviewModelProperty}" />
        <Setter Property="Canvas.Top" Value="{Binding YviewModelProperty}" />
    </Style>
</ItemsControl.ItemContainerStyle>

將文本框的datacontext強制轉換為您的viewmodel類型,然后設置XviewModelProperty和YviewModelProperty。

確保它們在設置時提高了屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM