Kennt sich jemand mit XAML und Data Binding aus?

Bei mir ist folgender Fehler aufgetreten:

Der Name "MainViewModel" ist im Namespace "clr-namespace:LINQ3_Test_aus_LINQ2" nicht vorhanden

Die Klasse ist allerdings in dem Namespace definiert, weshalb ich nicht verstehe, wieso der Fehler auftritt. Ich habe die Frage bereits auf StackOverflow gestellt, nur bisher noch keine Antwort erhalten, weshalb ich hier mein Glück versuche.

Hier einmal der XAML-Code:

<Window x:Class="LINQ3_Test_aus_LINQ2.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:LINQ3_Test_aus_LINQ2"
  Title="MainWindow" Height="450" Width="800">
  <Window.DataContext>
    <local:MainViewModel />
  </Window.DataContext>
  <Grid>
    <TextBox x:Name="txt_LiefNr" HorizontalAlignment="Left" Height="26" Margin="55,50,0,0" TextWrapping="Wrap" Text="{Binding LiefNr}" VerticalAlignment="Top" Width="125" />
    <TextBox x:Name="txt_LiefName" HorizontalAlignment="Left" Height="26" Margin="55,93,0,0" TextWrapping="Wrap" Text="{Binding LiefName}" VerticalAlignment="Top" Width="125" />
    <Button x:Name="btn_LiefNr" Content="Button" HorizontalAlignment="Left" Height="26" Margin="215,50,0,0" VerticalAlignment="Top" Width="116" Command="{Binding LookupCommand}" />
  </Grid>
</Window>

Und hier die Klasse MainViewModel:

using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace LINQ3_Test_aus_LINQ2
{
  public class MainViewModel : INotifyPropertyChanged
  {
    private string _liefNr;
    private string _liefName;

    public ICommand LookupCommand { get; set; }

    public string LiefNr
    {
      get { return _liefNr; }
      set
      {
        _liefNr = value;
        OnPropertyChanged();
      }
    }

    public string LiefName
    {
      get { return _liefName; }
      set
      {
        _liefName = value;
        OnPropertyChanged();
      }
    }

    public MainViewModel()
    {
      LookupCommand = new RelayCommand(Lookup);
    }

    private void Lookup()
    {
      Excel.OpenFile();
      LiefName = Excel.Fill(LiefNr);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
  }
}
C Sharp, Visual Studio, Binding, 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 zu Frage
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 zu Frage
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
[MVVM] Canvas Background Image via Slider ändern?

Hallo.

Ich hatte eigentlich nicht vor wegen der Sache was zu fragen, aber hab das Gefühl, ich verfolge den falschen Weg.

Wie der Name schon sagt, möchte ich mittels einer Sliderbewegung die Bilder in einem Canvas ändern.

Meine Denkweise sah so aus:

  <Slider x:Name="mySlider" HorizontalAlignment="Left" Height="58" Margin="209,948,0,0" VerticalAlignment="Top" Width="407" Minimum="0" Maximum="15"
        TickFrequency="1" TickPlacement="TopLeft" IsSnapToTickEnabled="True" ValueChanged="sliderChangeValue"/>

An diesen Slider ist ein ChangeValue-Event angehängt, dass eine BitmapImage Property ändert.

Jetzt habe ich noch ein ItemsControl mit einem Canvas darin, in dem die Bilder dargestellt werden sollen.

  <ItemsControl x:Name="canvas2" Margin="209,678,1012,124.8" Background="#FFC4C4C4" ItemsSource="{Binding LoadFieldMapsFIELDcol}">
            <Canvas>
                <Canvas.Background>
                    <ImageBrush ImageSource="{Binding BitIm, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Canvas.Background>
            </Canvas>
        </ItemsControl>

Wischiwaschi ChangeVlaue Event zum testen ( hat auch nix mit MVVM zu tun, ist im MainWindow. Wichtig ist nur die letzte Zeile)

  public void sliderChangeValue(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
      Collections col = new Collections();
      ObservableCollection<BitmapImage> images = new ObservableCollection<BitmapImage>();
      Mittelebene mit = new Mittelebene();
      images = col.LoadFieldMap();
      BitmapImage bild = new BitmapImage();
       
      mit.BitIm = images[0];    
    }

Meine Idee war, der Slider setzt die BitmapImage BitIM Property beim sliden auf das erste Bild aus einer Imageliste ( zu Testzwecken ). Das Canvas merkt dass die ImageSource geändert wurde und setzt das Bild, dass ich der Property vom Slider aus zugewiesen habe. Aber es tut sich nix.....

Ich hatte auch versucht mit dem Elementnamen Verweise zu erstellen. Rein vom optischen sah es schlüssig aus :) Aber ätsch..

In meinen Augen ist an der obigen Verkettung nix falsches.

Ich hatte natürlich intensiv gegoogelt. Die meisten hatten für solche Späßchen Listboxen genommen und Grids. Aber das muss doch mit einem Canvas auch klappen.

Ich verstehe auch nicht, warum ich im Code behind eines Canvas über die Background Eigenschaft nur die Farbe ändern kann über ein SolidColorBrush.

Mache ich

       <Canvas>
                <Canvas.Background>
                    <ImageBrush ImageSource="{Binding BitIm, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Canvas.Background>
            </Canvas>

will er dann auf einmal ein BitmapImage haben. Ich kann zwar ein Bild auch umwandeln, aber dann wird nix angezeigt. Nur ein BitmapImage wird angezeigt. Esseidenn ich nutze diese URI Sache.

Aber aktuell ist mir nur wichtig, warum die oben genannten Codezeilen nicht das tun, was sie sollen.

Computer, Technik, programmieren, Technologie, Windows Presentation Foundation, Spiele und Gaming

Meistgelesene Fragen zum Thema Windows Presentation Foundation