Forum: PC-Programmierung Teilfläche ausblenden


von Hansen (Gast)


Lesenswert?

Hallo ,

ich arbeite gerade an einer wpf-Oberfläche unter Visual Studio C# 2010.

Meine Oberfläche besteht aus einer Fenster-Titelleiste, einer 
Canvas-Fläche, auf der ich zeichne, und einer Fläche unten, um diverse 
Steuer-Möglichkeiten für das Zeichnen zu haben. Diese Steuerfläche macht 
zwar nur
5% meiner Bildschirmhöhe (1200 Pixel) aus, jedoch möchte ich eine 
Möglichkeit schaffen, diese Steuer-Fläche auszublenden. Bei der 
Titelleiste
schaffe ich das über eine Checkbox und
1
...
2
this.WindowStyle = WindowStyle.None;


Was für eine Steuer-Fläche müsste das sein, um sie ausblenden und auch 
wieder
einblenden zu können?

Danke für Eure Hilfe.

Hansen

von Hansen (Gast)


Lesenswert?

Ach ja, gleichzeitig soll die Canvas-Fläche um die ausgeblendete Fläche 
"erweitert" werden.

Kann mir jemand ein Stichwort nennen, unter dem ich suchen kann?

Hansen

von manni (Gast)


Lesenswert?

Hansen schrieb:

> Kann mir jemand ein Stichwort nennen, unter dem ich suchen kann?

Visibility.Collapsed / Visibility.Visible.
Man könnte auch die Höhe der Leiste (d.h., des Controls, das Du dafür 
verwenden möchtest) setzen oder animieren. Die Leiste kannst Du unten 
andocken. Simples Beispiel mit StatusBar-Control:
1
<Grid>
2
  <DockPanel LastChildFill="True">
3
    <StatusBar x:Name="bottomBar"  Height="60" DockPanel.Dock="Bottom">
4
      <TextBlock Margin="5">Bla</TextBlock>
5
    </StatusBar>
6
    <Canvas>
7
    </Canvas>
8
  </DockPanel>
9
</Grid>

von Hansen (Gast)


Lesenswert?

Hallo manni,

danke für deinen Vorschlag.


Frage: Wenn ich vier Text-Blöcke "frei" in der StatusBar platzieren 
will, wie mache ich das? So wie im folgenden gezeigt, werden die 
TextBlöcke einfach neben einander platziert.

1
<DockPanel LastChildFill="True">
2
            <StatusBar x:Name="bottomBar"  Height="60" DockPanel.Dock="Bottom">
3
                <TextBlock Margin="5">Bla1</TextBlock>
4
                <TextBlock Margin="5">Bla2</TextBlock>
5
                <TextBlock Margin="5">Bla3</TextBlock>
6
                <TextBlock Margin="5">Bla4</TextBlock>
7
            </StatusBar>
8
            <Canvas>
9
                <Button Canvas.Left="276" Canvas.Top="79" Content="Button" Height="23" Name="button1" Width="75" />
10
            </Canvas>
11
</DockPanel>



VG, Hansen

von Hansen (Gast)


Lesenswert?

>Wenn ich vier Text-Blöcke "frei" in der StatusBar platzieren will

Naja, oder zumindest Bla2 unter Bla1, und rechts daneben: Bla4 unter 
Bla3

Mir ist schon klar, dass das mit der Dock-Eigenschaft immer aufgefüllt 
wird bezüglich der Positionierung. Wie löst man diese Starrheit?

von Michael K. (brutzel)


Lesenswert?

Du kannst beliebige Controls benutzen bzw. diese verschachteln. Die 
Statusbar war nur ein Beispiel ("StatusBarItem" fehlt auch noch, aber 
das ändert hier nichts an deinem Problem). Wenn Du mit "frei platzieren" 
meinst, dass Du feste Koordinaten für die enthaltenen Controls (im 
Beispiel die vier Textblöcke) verwenden willst, kannst Du ein zweites 
Canvas-Element als untere Leiste einsetzen. Allerdings ist das für 
diesen Zweck eher unüblich, da sich das Layout ja meist an verschiedene 
Auflösungen bzw. Fenstergrößen anpassen soll.

"Naja, oder zumindest Bla2 unter Bla1, und rechts daneben: Bla4 unter
Bla3"

Dafür würde sich ein Grid oder UniformGrid anbieten. Beispiel:
1
<Window x:Class="bottombar.MainWindow"
2
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
4
  Title="MainWindow" Height="350" Width="525">
5
6
  <Window.Resources>
7
    <Style x:Key="BottomGridTB" TargetType="TextBlock">
8
      <Setter Property="VerticalAlignment" Value="Center" />
9
      <Setter Property="Margin" Value="5" />
10
    </Style>
11
12
    <RoutedUICommand x:Key="ToggleBottomBar" Text="Toggle bottom bar" />
13
  </Window.Resources>
14
15
  <Window.CommandBindings>
16
    <CommandBinding Command="{StaticResource ToggleBottomBar}" Executed="OnExecutedToggleBottomBar" />
17
  </Window.CommandBindings>
18
19
  <Window.InputBindings>
20
    <KeyBinding Command="{StaticResource ToggleBottomBar}" Gesture="CTRL+B" CommandParameter="{Binding ElementName=bottomBar}" />
21
  </Window.InputBindings>
22
  
23
  <DockPanel LastChildFill="True">
24
    <Grid x:Name="bottomBar" Background="{x:Static SystemColors.ControlLightBrush}" DockPanel.Dock="Bottom">
25
      <Grid.RowDefinitions>
26
        <RowDefinition />
27
        <RowDefinition Height="1" />
28
        <RowDefinition />
29
      </Grid.RowDefinitions>
30
      <Grid.ColumnDefinitions>
31
        <ColumnDefinition Width="4*" />
32
        <ColumnDefinition Width="4*"/>
33
        <ColumnDefinition Width="1*"/>
34
      </Grid.ColumnDefinitions>
35
      <TextBlock Style="{StaticResource BottomGridTB}">Bla1</TextBlock>
36
      <TextBlock Style="{StaticResource BottomGridTB}" Grid.Row="2">Bla2</TextBlock>
37
      <TextBlock Style="{StaticResource BottomGridTB}" Grid.Column="1">Bla3</TextBlock>
38
      <TextBlock Style="{StaticResource BottomGridTB}" Grid.Row="2" Grid.Column="1">Bla4</TextBlock>
39
      <Border Grid.Row="1" Grid.ColumnSpan="3" Background="AliceBlue" />
40
    </Grid>    
41
    <Canvas />
42
  </DockPanel>
43
</Window>
1
public void OnExecutedToggleBottomBar(object sender, ExecutedRoutedEventArgs e)
2
{
3
  var element = (UIElement)e.Parameter;
4
  if(element != null)
5
  {
6
    if(element.Visibility == Visibility.Collapsed) element.Visibility = Visibility.Visible;
7
    else element.Visibility = Visibility.Collapsed;
8
  }
9
}

3 Spalten, damit das Ganze etwas nach links orientiert ist. Strg + B 
sollte die Leiste (also das Grid-Element) sichtbar/unsichtbar machen. 
Ein paar Styles, damit sich einiges zentral anpassen lässt. Du kannst 
natürlich andere Controls statt der Textboxen verwenden, mehr Spalten 
einfügen, Grids oder andere Panels in Zellen setzen, das Ganze komplett 
anders stylen etc. WPF ist da sehr flexibel.

// Edit: Methode für die Linie geändert.

: Bearbeitet durch User
von Michael K. (brutzel)


Lesenswert?

Noch etwas allgemeiner; das Command kann man für beliebige Elemente 
verwenden (das Element wird ja ohnehin als Parameter übergeben).
1
...
2
<RoutedUICommand x:Key="ToggleVisibility" Text="Toggle visibility" />
3
  </Window.Resources>
4
5
  <Window.CommandBindings>
6
    <CommandBinding Command="{StaticResource ToggleVisibility}" Executed="OnExecutedToggleVisibility" />
7
  </Window.CommandBindings>
8
9
  <Window.InputBindings>
10
    <KeyBinding Command="{StaticResource ToggleVisibility}" Gesture="CTRL+B" CommandParameter="{Binding ElementName=bottomBar}" />
11
  </Window.InputBindings>
1
public void OnExecutedToggleVisibility(object sender, ExecutedRoutedEventArgs e)
2
// ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.