Frage

Ich habe ein Problem in Bezug auf Gridsplitter visiblity.

In diesem, was ich eine Winform Datagridview bin Hosting. Die Gridsplitter, wenn gezogen ist gut sichtbar auf andere Kontrollen. Aber nicht nur in diesem Raster. In der Tat, was ich anstelle von Datagridview Host, wird die oberste Kontrolle, die das Gridsplitter versteckt dahinter macht.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Name="rowForButton"/>
        <RowDefinition Name="rowForGridSplitter" Height="Auto" MinHeight="81" />
    </Grid.RowDefinitions>
    <Button Grid.Row="0" Height="50" Width="110" Content="Button in First Row"/>
    <my:WindowsFormsHost Panel.ZIndex="0" Grid.Row="1"  Margin="30,11,138,0" x:Name="winHost" Height="58" VerticalAlignment="Top" OpacityMask="Transparent">            
        <win:DataGridView x:Name="dataGridView"></win:DataGridView>
    </my:WindowsFormsHost>        
    <GridSplitter  BorderThickness="1" Panel.ZIndex="1" Grid.Row="1" HorizontalAlignment="Stretch" Height="5" ShowsPreview="True" VerticalAlignment="Top">
    </GridSplitter>
</Grid>
War es hilfreich?

Lösung

Windows Forms-Steuerelemente wird immer getrennt von Ihrem WPF-Steuerelemente gerendert, und als Ergebnis wird immer Ihre WPF-Anwendung erscheint über.

Siehe Hosting ein Microsoft Win32-Fenster in WPF ( Hierher Bemerkenswerte Unterschiede in dem Ausgabeverhalten ) für weitere Informationen.

Andere Tipps

In der Regel sollten Sie entweder ein Gridsplitter in seine eigene Gitterzelle setzen oder über die Margen sicherzustellen, dass keine Steuer sie überlappen. Aber ich weiß nicht, ob das genau hier auf Sie zutrifft. Siehe auch hier .

ich dieses Problem auch begegnet, es ist meine Lösung:

var splitter = new GridSplitter()
        {
            HorizontalAlignment = HorizontalAlignment.Stretch,
            VerticalAlignment = VerticalAlignment.Stretch,
            FocusVisualStyle = null,
            ShowsPreview = true,
            Background = new SolidColorBrush(new Color() { R = 1, G = 1, B = 1, A = 1 }),
        };

// non-style / essential window which will display over your WinForm control
var PopupWindowForSplitter = new PopupWindow()
        {
            Background = new SolidColorBrush(new Color() { R = 1, G = 1, B = 1, A = 1 }),
            Visibility = Visibility.Collapsed
        };
PopupWindowForSplitter.Show();
...

Point _ptForSplitterDrag = new Point(0,0);

splitter.DragStarted += (o, e) =>
        {
            var pt = splitter.PointToScreen(new Point());
            _ptForSplitterDrag = splitter.PointToScreen(Mouse.GetPosition(splitter));
            PopupWindowForSplitter.Left = pt.X;
            PopupWindowForSplitter.Top = pt.Y;
            PopupWindowForSplitter.Height = splitter.ActualHeight;
            PopupWindowForSplitter.Width = splitter.ActualWidth;
            PopupWindowForSplitter.Activate();
            PopupWindowForSplitter.Visibility = Visibility.Visible;
        };
        splitter.DragDelta += (o, e) =>
        {
            var pt = splitter.PointToScreen(Mouse.GetPosition(splitter)) - _ptForSplitterDrag
                + splitter.PointToScreen(new Point());
            if (splitter.ResizeDirection == GridResizeDirection.Rows)
            {
                PopupWindowForSplitter.Top = pt.Y;
            }
            else
            {
                PopupWindowForSplitter.Left = pt.X;
            }
        };
        splitter.DragCompleted += (o, e) =>
        {
            var initializeData = typeof(GridSplitter).GetMethod("InitializeData", BindingFlags.NonPublic | BindingFlags.Instance);
            var moveSplitter = typeof(GridSplitter).GetMethod("MoveSplitter", BindingFlags.NonPublic | BindingFlags.Instance);
            if (moveSplitter != null && initializeData != null)
            {
                initializeData.Invoke(splitter, new object[] { true });

                var pt = splitter.PointToScreen(Mouse.GetPosition(splitter)) - _ptForSplitterDrag;
                if (splitter.ResizeDirection == GridResizeDirection.Rows)
                {
                    moveSplitter.Invoke(splitter, new object[] { 0, pt.Y });
                }
                else
                {
                    moveSplitter.Invoke(splitter, new object[] { pt.X, 0 });
                }
            }
            PopupWindowForSplitter.Visibility = Visibility.Collapsed;
        };

Vielleicht gibt es einige Probleme in meiner Beschreibung wegen meines schlechten Englisch, aber ich denke, der Code genug ist, um es zu erklären.

Versuchen Sie, ein WPF-native Datagrid-Steuerelement. Es gibt ein paar kommerzielle Steuerelemente von Drittanbietern Sie kaufen können, oder Sie können einen Blick auf ein von Microsoft (derzeit noch in CTP) nehmen:

In Ihrer Situation die schnellste fix wäre die GirdSplitter auf die Zeile mit der Taste zu bewegen:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Name="rowForButton"/>
        <RowDefinition Name="rowForGridSplitter" Height="Auto" MinHeight="81" />
    </Grid.RowDefinitions>
    <Button Grid.Row="0" Height="50" Width="110" Content="Button in First Row"/>
    <my:WindowsFormsHost Panel.ZIndex="0" Grid.Row="1"  Margin="30,11,138,0" x:Name="winHost" Height="58" VerticalAlignment="Top" OpacityMask="Transparent">            
        <win:DataGridView x:Name="dataGridView"></win:DataGridView>
    </my:WindowsFormsHost>        
    <GridSplitter  BorderThickness="1" Panel.ZIndex="1" Grid.Row="0" HorizontalAlignment="Stretch" Height="5" ShowsPreview="True" VerticalAlignment="Bottom">
    </GridSplitter>
</Grid>

Jetzt nur noch die Ränder anpassen, um sicherzustellen, dass etwas Platz zwischen dem Knopf ist und der Netz-Splitter.

Die Lösung wäre eine ‚Windows Form‘ Etikett im Raster Teiler hinzuzufügen und so programmatisch nach der Zugabe des Datagridview zu tun, damit es oben drauf erscheint, wie folgt:

void AddLabelToSplitter()
{
string template =
    @" <ControlTemplate 
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:mn='clr-namespace:MyNameSpace;assembly=MyAssembly'  
xmlns:wf='clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms'   
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' TargetType='{x:Type GridSplitter}'>
            <mn:ExtendedWindowsFormsHost x:Name='Grid_Splitter_WindowsFormsHost' HorizontalAlignment='Stretch'  VerticalAlignment='Stretch'>
                <wf:Label Dock='Fill' BackColor='DarkGray'></wf:Label>
            </mn:ExtendedWindowsFormsHost>
        </ControlTemplate>";
Grid_Splitter.Template = (ControlTemplate)XamlReader.Parse(template);
}

einen regulären Windows-Formular-Host verwenden würde nicht funktionieren, da es nicht die Mausereignisse an den Splitter überliefern würde, so verwenden Sie die ExtendedWindowsFormsHost statt von unten Link:

Halten Sie Mausereignisse von Windows auf sprudelnden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top