Windows Presentation Foundation – die neusten Beiträge

WPF: DataGridTextColumn basierend auf ViewModel-Eigenschaft ausblenden – wie geht das?

Hallo zusammen,

ich arbeite an einer WPF-Anwendung und habe ein DataGrid, in dem ich eine bestimmte Spalte ausblenden möchte, wenn eine boolesche Eigenschaft (IstPM) im ViewModel true ist.

<DataGridTextColumn Header="Länge"
    Binding="{Binding Laenge, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=N1}"
    Visibility="{Binding IstNichtPM, Converter={StaticResource booleanToVisibilityConverter}}"
    Width="70"/>

Dabei ist IstNichtPM eine bool-Eigenschaft im ViewModel, die true sein sollte, wenn die Spalte sichtbar sein soll.

Ich verwende einen BooleanToVisibilityConverter, der true zu Visible und false zu Collapsed konvertiert.

Problem:

Die Spalte bleibt immer sichtbar oder wird nicht korrekt aktualisiert.

Ich habe auch versucht, es in Code-Behind zu ändern, aber das geht auch nicht, da man kein x-Name geben kann

„Der Wert „colLaenge“ des Name-Attributs kann für das Element „DataGridTextColumn“ nicht festgelegt werden.“

die IstPM und istNichtPM funktioniert aufjedenfall, da ich damit auch Tabs ausgeblendet habe in der Page. Das hat ohne Probleme funktioniert

=>

ausblenden bei IstNichtPM

<TabItem Header="Allgemein" Visibility="{Binding IstNichtPM, Converter={StaticResource booleanToVisibilityConverter}}">

einblenden bei IstPM

<TabItem Header="Allgemein" Visibility="{Binding IstPM, Converter={StaticResource booleanToVisibilityConverter}}">

beim DGV bin ich so langsam echt am verzweifeln.

Hat jemand eine funktionierende Lösung, wie ich eine DataGridTextColumn in WPF dynamisch ausblenden kann?

Bin für jeden Tipp dankbar!

C Sharp, Windows Presentation Foundation

WPF Zufallsgenerator GUI?

Guten Tag,

ich habe probiert einen Zufallsgenerator in WPF mit einer GUI zu erstellen.

Ich habe zwei Text boxen wo jeweils die niedrigste und höchste Zahl eingegeben werden soll, einen Button wenn man den drückt in lbl2(Label) die Zufallszahl ausgegeben werden. Allerdings erkennt er zahl1 und zahl2 nicht obwohl ich sie mit "return" wieder gegeben habe. Sonst zeigt er mir aber keine Probleme an.

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.Navigation;
using System.Windows.Shapes;


namespace WpfApp1
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }


        public int txtbox1_TextChanged(object sender, TextChangedEventArgs e)
        {
            int zahl1 = Convert.ToInt32(txtbox1.Text);
            return zahl2;
        }


        public int txtbox2_TextChanged(object sender, TextChangedEventArgs e)
        {
            int zahl2 = Convert.ToInt32(txtbox1.Text);
            return zahl2;
        }


        private void btn1_Click(object sender, RoutedEventArgs e)
        {
            Random zufallszahl = new Random();


            lbl2.Content = zufallszahl.Next(zahl1, zahl2);
        }
    }
}
Computer, programmieren, Windows Presentation Foundation

WPF & C#: Erweiterte Stoppuhr erstellen - Fehlermeldungen?

Hallo zusammen,

ich codiere gerade im Visual Studio 2019 in WPF mit der Computersprache C# eine Stoppuhr. Diese soll in einer 24-Stunden-Anzeige dargestellt werden, wo ich auch die Uhr stoppen und wieder laufen lassen kann. Das klappt alles.

Bis ich auf dieses Problem gestoßen bin:

Ich soll noch Zwischenzeiten der gelaufenen Zeit darstellen, die rechts in einer ListBox erscheinen sollen. Daneben noch ein Button namens "Zurücksetzen", der die gesamt gelaufene Zeit auf 0 zurücksetzt.

So sollte das Ergebnis aussehen:

swoutput.png (434×296) (sourcecodester.com)

(in dem Fall -> Mark = Zwischenzeit)

Bei mir stellt er es aber nicht so dar.

Dies ist hier mein Quelltext in Visual Studio 2019:

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.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace Wpf_Stoppuhr
{
  /// <summary>
  /// Interaktionslogik für MainWindow.xaml
  /// </summary>
  public partial class MainWindow : Window
  {
    DispatcherTimer timer = new DispatcherTimer();

    private int zs = 0, sek = 0, min = 0, h = 0;

    private bool pruef = true;

    public MainWindow()
    {
      InitializeComponent();
      timer.Tick += new EventHandler(timer_Tick);
      timer.Interval = new TimeSpan(0, 0, 0, 0, 10);
      L_Ausgabe.Content = "0 : 0 : 0 : 0";
    }

    private void timer_Tick(object sender, EventArgs e)
    {
      zs++;

      if (zs == 10)
      {
        sek++;
        zs = 0;
      }
      else if (sek == 60)
      {
        sek = 0;
        min++;
      }
      else if (min == 60)
      {
        min = 0;
        h++;
      }
      else if (h == 24)
      {
        h = 0;
      }

      L_Ausgabe.Content = h + " : " + min + " : " + sek + " : " + zs;
    }

    private void B_Start_Click(object sender, EventArgs e)
    {
      if (pruef)
      {
        timer.Start();
        B_Start.Content = "Start";
        pruef = false;
      }
      else
      {
        timer.Stop();
        B_Start.Content = "Stopp";
        pruef = true;
      }
    }

    private void B_zwz_Click_1(Object sender, EventArgs e)
    {
      ListBox1.Items.Add(L_Ausgabe.Content);
    }

    private void B_zurueck_Click(Object sender, EventArgs e)
    {
      L_Ausgabe.Content = " 0: 0 :0 : 0 ";
      ListBox1.Items.Clear();
      timer.Stop();
    }
  }
}
  • B_Start = Start Knopf
  • ListBox1 = die Listbox
  • L_Ausgabe = Label für die Zeit
  • B_zurueck = Button fürs zurücksetzen
  • B_zwz = Button für die Zwischenzeit

Ich wäre sehr dankbar für eine Lösung. :)

Mit freundlichen Grüßen

Cynix

Computer, Schule, Sprache, programmieren, Windows Presentation Foundation

Wie kann ich meinen Button Click so ändern, dass er immer automatisch ausgeführt wird, wenn meine TextBox nicht mehr leer ist?

Ich habe ein DataGrid bei dem ich mit MVVM die Daten beziehe. Jetzt habe ich es so gemacht das wenn ich diesen Button drücke:

<TextBlock Text="&#xE71C;" x:Key="DataGridSelectAllButtonStyle.Content"/>
                <Style x:Key="{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}"
                    TargetType="{x:Type Button}">
                    <Setter Property="Background" Value="Gray"/>
                    <Setter Property="BorderBrush" Value="White"/>
                    <Setter Property="BorderThickness" Value="0 0 1 0"/>
                    <EventSetter Event="Click" Handler="ClearButton_Click"/>
                    <Setter Property="Content">
                        <Setter.Value>
                            <StackPanel Background="Gray" Height="40" Width="11">
                                <Separator Background="White" Margin="0,17,-1,0"/>
                                <TextBlock Background="{x:Null}" HorizontalAlignment="Center" Height="13"  Margin="0 5 0 0"
                            FontFamily="Segoe MDL2 Assets" FontWeight="Light" FontSize="7"
                            Text="{Binding Text, Source={StaticResource DataGridSelectAllButtonStyle.Content}}">
                                </TextBlock>
                            </StackPanel>
                        </Setter.Value>
                    </Setter>
                </Style>

Und meine TextBoxen nicht leer sind sie dann automatisch geleert werden. Wenn jedoch die TextBoxen nicht leer sind und ich denn Button noch nicht gedrückt habe soll sich der Content von dem Button ändern zu einem Kreuz. Das habe ich bereits jedoch nur bedingt geschafft denn jetzt ist es bei mir so das nur wenn ich auf denn Button Clicke der Content geändert wird und nicht automatisch sobald er erkennt die TextBoxen sind nicht mehr leer. Also mein Ziel ist es das wenn die TextBoxen leer sind das standard Symbol (Content) angezeigt wird und sobald eine der TextBoxen nicht mehr leer sind soll sich der Button Content automatisch in ein Kreuz ändern und nicht wie jetzt das es nur manuell über das Klicken auf den Button funktioniert und sobald alle TextBoxen wieder leer sind soll das Anfangs Symbol(Content gezeigt werden). Und hier ist erstmal mein Code Behind womit ich denn Button content per Click event ändere:

private void ClearButton_Click(object sender, RoutedEventArgs e)
        {
            if (!String.IsNullOrEmpty(IDSearcBox.Text))
            {
                if (sender is FrameworkElement element)
                {
                    TextBlock textBlock = (TextBlock)element.FindResource("DataGridSelectAllButtonStyle.Content");
                    textBlock.Text = textBlock.Text == "\xE711"
                        ? "\xE71C"
                        : "\xE711";
                }
            }
        }
Computer, C Sharp, XAML, Windows Presentation Foundation

Wie kann ich in WPF diese Weißen Felder entfernen?

Guten tag ich habe in meinem WPF Programm jetzt irgendwie solche weißen Felder:

Also das ganz links und das zwischen dem Header und denn Cells,wie kriege ich die Weg?

Mein Code:

<StackPanel Orientation="Vertical" Background="Red">
        <DataGrid Height="438" x:Name="data" Width="801" >
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <Setter Property="Background" Value="#292F3B"/>
                    <Setter Property="Foreground" Value="LightBlue"/>
                    <Setter Property="FontWeight" Value="SemiBold"/>
                    <Setter Property="Height" Value="30"/>
                    <Setter Property="FontSize" Value="15"/>
                    <Setter Property="BorderThickness" Value="0,0,2,0" />
                    <Setter Property="BorderBrush" Value="#333333"/>
                    <Setter Property="Padding" Value="10 0 0 0"/>
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="#454F5D"/>
                        </Trigger>
                    </Style.Triggers>
                    
                </Style>
                <Style TargetType="{x:Type DataGrid}">
                    <Setter Property="Background" Value="#20262E"/>
                </Style>


                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Background" Value="#292F3B"/>
                    <Setter Property="Foreground" Value="LightBlue"/>
                    <Setter Property="BorderThickness" Value="0,0,2,0" />
                    <Setter Property="BorderBrush" Value="#333333"/>
                    <Setter Property="Margin" Value="0 5 0 0"/>
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="#454F5D"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.Resources>
            
            
            
            <DataGrid.Columns>
                <DataGridTextColumn Header="user" Binding="{Binding user}"   Width="*"/>
                <DataGridTextColumn Header="User1" Binding="{Binding user1}" Width="*"/>
                <DataGridTextColumn Header="User2" Binding="{Binding user2}" Width="*"/>
                <DataGridTextColumn Header="User3" Binding="{Binding user3}" Width="*"/>
                <DataGridTextColumn Header="User4" Binding="{Binding user4}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
    </StackPanel>
Bild zum Beitrag
Computer, Informatik, Windows Presentation Foundation

Wie erstelle ich in C# Wpf einen Runden ToggleButton?

Ich möchte einen ToggleButten erstellen, der einen runden Rand hat und seine Breite automatisch anpasst.

Mein Code bisher:

Style:

<Style TargetType="ToggleButton" x:Key="favorite_btn">
            <Setter Property="Height" Value="30"/>
            <Setter Property="Width" Value="Auto"/>
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Cursor" Value="Hand"/>
            <Setter Property="Margin" Value="60,0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border BorderBrush="{TemplateBinding Background}" BorderThickness="1" CornerRadius="20">
                            <StackPanel Orientation="Horizontal" Background="Red">
                                <Image Height="20" Width="20" Source="{Binding Path=Image}" VerticalAlignment="Center" Margin="5,0,0,0"/>
                                <TextBlock Text="{Binding Path=Text}" Foreground="White" FontSize="20" Margin="5,0" VerticalAlignment="Center" Width="Auto"/>
                            </StackPanel>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

und

<ToggleButton DockPanel.Dock="Top" x:Name="favorite_btn" Style="{StaticResource favorite_btn}" Checked="favorite_btn_Checked" Unchecked="favorite_btn_Unchecked" />

Jedoch bekomme ich am Ende folgendes heraus:

Herauskommen soll aber:

Was mach ich falsch?

Bild zum Beitrag
Computer, Schule, programmieren, C Sharp, Windows Presentation Foundation

C# WPF User Control Typname nicht vorhanden?

Hallo an alle Programmierfreunde da draußen!

Ich wollte mir gerne eine Custom User Control erstellen, weil ich sie in dieser Art und Weise in fast jeder WPF-App verwende.

Mein C# - Code:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace MenuBar
{
    public partial class MenuBar : UserControl
    {
        public List<string> Buttons;
        public SolidColorBrush Background;
        public SolidColorBrush Foreground;
        public SolidColorBrush BorderBrush;
        public Thickness BorderThickness;

    public MenuBar(int winHeight)
    {
        InitializeComponent();
        GridMenu.Height = winHeight;
        GridMenu.HorizontalAlignment = HorizontalAlignment.Stretch;
        GridMenu.VerticalAlignment = VerticalAlignment.Top;
    }

    public void Create()
    {
        ColumnDefinition c;
        for (int i = 0; i &lt;= Buttons.Count; i++)
        {
            c = new ColumnDefinition();
            c.Width = new GridLength(GridMenu.Width / Buttons.Count);
            GridMenu.ColumnDefinitions.Add(c);
        }

        Button btn;
        int col = 0;
        foreach (string s in Buttons)
        {
            btn = DefaultButton(s);
            GridMenu.Children.Add(btn);
            Grid.SetColumn(btn, col);
            col++;
        }
    }

    private Button DefaultButton(string title)
    {
        Button btn = new Button();
        btn.Width = GridMenu.Width / Buttons.Count;
        btn.Height = GridMenu.Height;
        btn.Background = Background;
        btn.Foreground = Foreground;
        btn.Cursor = Cursors.Hand;
        btn.BorderBrush = BorderBrush;
        btn.BorderThickness = BorderThickness;
        btn.Content = title;
        
        return btn;
    }
}

}

Mein XAML - Code:

<UserControl x:Class="MenuBar.MenuBar"
             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"
             xmlns:local="clr-namespace:MenuBar"
             mc:Ignorable="d"
             x:Name="Menu">
    <Grid x:Name="GridMenu"></Grid>
</UserControl>

Abgesehen davon, dass ich nicht sicher sagen kann, dass der Code so funktioniert, bekomme ich schon beim Build eine Fehlermeldung:

 MenuBar.xaml(9, 26): [CS0426] Der Typname "MenuBar" ist im Typ "MenuBar" nicht vorhanden.

Ich habe leider absolut keine Ahnung, wo der Fehler liegt, ich programmiere noch nicht so lange. Vielleicht kann mir jemand von euch helfen?

Das Projekt wurde als DesktopApplication im .NETCore v3.1 mit JetBrains Rider erstellt.

Danke für die Hilfe!

programmieren, C Sharp, Windows Presentation Foundation

Meistgelesene Beiträge zum Thema Windows Presentation Foundation