Laden...

Textbox nicht editierbar

Erstellt von Icarus666 vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.121 Views
Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 13 Jahren
Textbox nicht editierbar

Hallo zusammen.
Ich habe ein ganz merkwürdiges Problem im zusammengang mit WPF.
Ich habe ein Fenster mit einem Grid aus dem WPF Toolkit und wollte drüber eine Textbox haben, wo der user Texteingeben kann, nachdem das Grid durchsucht wird.

Ich kann in der Textbox allerdings nichts eintippen. Komischerweise funktioniert Paste und Copy. Ich kann einen Text also einfügen und kann einzelne Buchstaben mit Backspace löschen. Andere Buchstaben gehen nicht.
In anderen Formularen funktioniert die textbox auch wunderbar und ich denke nicht, dass im XAML ein Fehler ist:

<Window x:Class="PhoneList.WindowPhoneList"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="PhoneList" Height="300" Width="687" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" WindowStyle="None" MouseLeave="Window_MouseLeave" MouseEnter="Window_MouseEnter" AllowsTransparency="True" WindowState="Minimized" ShowInTaskbar="False" StateChanged="Window_StateChanged" BorderThickness="0" Opacity="0.9" Visibility="Visible" Background="Black" Loaded="Window_Loaded" Icon="b.ico">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" MinHeight="25" />
      <RowDefinition Height="Auto" MinHeight="20" />
      <RowDefinition Height="Auto" MinHeight="20" />
      <RowDefinition Height="240*" />
    </Grid.RowDefinitions>      
    <ToolBarTray Grid.Row="1" VerticalAlignment="Stretch">
      <ToolBarTray.Background>
        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
          <GradientStop Color="DarkGray" Offset="0.0" />
          <GradientStop Color="White" Offset="0.25" />
          <GradientStop Color="DarkGray" Offset="0.5" />
        </LinearGradientBrush>
      </ToolBarTray.Background>
      <ToolBar Height="Auto" Name="toolBar1" VerticalAlignment="Top" Band="1" BandIndex="1" >
          <ToolBar.Background>
          <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
            <GradientStop Color="DarkGray" Offset="0.0" />
            <GradientStop Color="White" Offset="0.25" />
            <GradientStop Color="DarkGray" Offset="0.5" />
          </LinearGradientBrush>
        </ToolBar.Background>
        <Button FocusVisualStyle="{DynamicResource MyFocusVisual}" >
          <Image Source="Images/phone_green_32x32.png" Name="buttonPhoneList" MouseLeftButtonDown="buttonPhoneList_MouseLeftButtonDown"></Image>
        </Button>
        <Button FocusVisualStyle="{DynamicResource MyFocusVisual}" >
          <Image Source="Images/phone_red_32x32.png" Name="buttonCellPhoneList" MouseLeftButtonDown="buttonCellPhoneList_MouseLeftButtonDown"></Image>
        </Button>
        <Button FocusVisualStyle="{DynamicResource MyFocusVisual}" >
          <Image Source="Images/phone_blue_32x32.png" Name="buttonBirthdayList" MouseLeftButtonDown="buttonBirthdayList_MouseLeftButtonDown"></Image>
        </Button>
      </ToolBar>
    </ToolBarTray>
    <my:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Employee}" Name="dataGridEmployees" GridLinesVisibility="None" HeadersVisibility="Column" BorderThickness="0" ColumnWidth="Auto" Grid.Row="3">
      <my:DataGrid.AlternatingRowBackground>
        <SolidColorBrush Color="LightYellow"/>
      </my:DataGrid.AlternatingRowBackground>
      <my:DataGrid.Columns>
        <my:DataGridTextColumn Header="Name" Binding="{Binding Self}" IsReadOnly="True" x:Name="NameColumn" />
        <my:DataGridTextColumn Header="Phone" Binding="{Binding Phone}" IsReadOnly="True" x:Name="PhoneColumn" />
        <my:DataGridTextColumn Header="Cellphone" Binding="{Binding Cellphone}" IsReadOnly="True" x:Name="CellphoneColumn" />
        <my:DataGridHyperlinkColumn Width="Auto" Header="Email" Binding="{Binding Email}" IsReadOnly="True" x:Name="EmailColumn" />
        <my:DataGridTextColumn Width="Auto" Header="Birthday" Binding="{Binding Birthday, StringFormat=d}" IsReadOnly="True" x:Name="BirthdayColumn" />
      </my:DataGrid.Columns>
    </my:DataGrid>
    <Grid HorizontalAlignment="Stretch" Margin="0,0,0,0" Name="grid1" Height="25" VerticalAlignment="Top">
      <Grid.Background>
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
          <GradientStop Color="White" Offset="0.0" />
          <GradientStop Color="Gray" Offset="0.35" />
          <GradientStop Color="Black" Offset="0.4" />
          <GradientStop Color="Black" Offset="1.0" />
        </LinearGradientBrush>
      </Grid.Background>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="27" />
        <ColumnDefinition Width="26" />
        <ColumnDefinition Width="46" />
        <ColumnDefinition Width="5" />
      </Grid.ColumnDefinitions>
      <Image Name="imageMinimize" Stretch="Fill" Source="Images\minimize.png" Grid.Column="1" MouseEnter="imageMinimize_MouseEnter" MouseLeave="imageMinimize_MouseLeave" Height="18" VerticalAlignment="Top" MouseUp="imageMinimize_MouseUp" HorizontalAlignment="Left" Width="27" />
      <Image Grid.ColumnSpan="1" Name="imageMaximize" Stretch="Fill" Source="Images\maximize.png" Grid.Column="2" MouseEnter="imageMaximize_MouseEnter" MouseLeave="imageMaximize_MouseLeave" Height="18" VerticalAlignment="Top" MouseUp="imageMaximize_MouseUp" />
      <Image Name="imageClose" Stretch="Fill" Source="Images\close.png" Grid.Column="3" MouseEnter="imageClose_MouseEnter" MouseLeave="imageClose_MouseLeave" Height="18" VerticalAlignment="Top" MouseUp="imageClose_MouseUp" HorizontalAlignment="Right" Width="46" />
    </Grid>
    <Label Grid.Row="2" Margin="0" Name="labelHeadline" Background="White" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" FontWeight="Bold" FontSize="13" VerticalAlignment="Top" BorderThickness="1" BorderBrush="DarkGray">
      Telefonliste
    </Label>
    <Border Grid.Row="2" CornerRadius="5,5,5,5" Height="24" BorderThickness="1" BorderBrush="Black" Margin="0,2,2,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="270">
      <TextBox BorderThickness="0" Foreground="Black" FontSize="11" VerticalAlignment="Center" Name="textBoxSearch" TextChanged="textBoxSearch_TextChanged">
        <TextBox.Background>
          <VisualBrush />
        </TextBox.Background>
      </TextBox>
    </Border>
  </Grid>
</Window>

Ich habe leider keinen blassen Schimmer an was das liegen könnte. Das Event ist es auf jeden Fall nicth, das wird bei einem Tastenanschlag überhaubt nicht gekastet.

M
17 Beiträge seit 2010
vor 13 Jahren

Wie sieht die entsprechende Code-Behind Datei aus? Insbesondere: Was macht die Implementierung des textBoxSearch_TextChanged Events???

Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 13 Jahren

Hier die Code-Behind Datei:


  public partial class WindowPhoneList : Window
  {
    private People employees = null;

    public WindowPhoneList()
    {
      InitializeComponent();
      InitWindow();
    }

    private void InitWindow()
    {
      System.Drawing.Rectangle Rect = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
      this.Top = Rect.Bottom - this.Height;
      this.Left = Rect.Right - this.Width;
      this.WindowState = WindowState.Normal;
      this.ShowInTaskbar = false;
      this.Visibility = Visibility.Hidden;
    }

    private class People : ObservableCollection<Employee>
    {
      public People(List<Employee> employees)
      {
        foreach (Employee e in employees)
          this.Add(e);
      }
    }

    private ICollectionView GetEmployees()
    {
      if (employees == null) {
        CMSManager manager = CMSManager.Instance();
        UserRights rights = manager.GetUserRights();
        Company c = rights.Company;
        employees = new People(manager.GetEmployees(c));
      }
      return CollectionViewSource.GetDefaultView(employees);
    }

    #region Window Control

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
      dataGridEmployees.ItemsSource = GetEmployees();
      if (this.WindowState == WindowState.Minimized)
        this.WindowState = WindowState.Normal;
    }

    private void Window_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
      this.Opacity = 0.9;
    }

    private void Window_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
      this.Opacity = 1.0;
    }

    private void Window_StateChanged(object sender, EventArgs e)
    {
      this.ShowInTaskbar = !(this.WindowState == WindowState.Minimized);
      if (this.WindowState == WindowState.Minimized) {
        this.Visibility = Visibility.Hidden;
        this.Topmost = false;
      }
      else {
        this.Visibility = Visibility.Visible;
        this.Topmost = true;
      }
    }

    #endregion

    #region Control Box

    private void imageClose_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
      imageClose.Source = new BitmapImage(new Uri(@"Images/close_hover.png", UriKind.Relative));
      DropShadowEffect effect = new DropShadowEffect();
      effect.BlurRadius = 20;
      effect.ShadowDepth = 3;
      effect.Direction = 0;
      effect.Color = Colors.Red;
      imageClose.Effect = effect;
    }

    private void imageClose_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
      imageClose.Source = new BitmapImage(new Uri(@"Images/close.png", UriKind.Relative));
      imageClose.Effect = null;
    }

    private void imageMaximize_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
      imageMaximize.Source = new BitmapImage(new Uri(@"Images/maximize_hover.png", UriKind.Relative));
      DropShadowEffect effect = new DropShadowEffect();
      effect.BlurRadius = 20;
      effect.ShadowDepth = 3;
      effect.Direction = 0;
      effect.Color = Colors.Blue;
      imageMaximize.Effect = effect;
    }

    private void imageMaximize_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
      imageMaximize.Source = new BitmapImage(new Uri(@"Images/maximize.png", UriKind.Relative));
      imageMaximize.Effect = null;
    }

    private void imageMinimize_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
      imageMinimize.Source = new BitmapImage(new Uri(@"Images/minimize_hover.png", UriKind.Relative));
      DropShadowEffect effect = new DropShadowEffect();
      effect.BlurRadius = 20;
      effect.ShadowDepth = 3;
      effect.Direction = 0;
      effect.Color = Colors.Blue;
      imageMinimize.Effect = effect;
    }

    private void imageMinimize_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
      imageMinimize.Source = new BitmapImage(new Uri(@"Images/minimize.png", UriKind.Relative));
      imageMinimize.Effect = null;
    }

    private void imageMaximize_MouseUp(object sender, MouseButtonEventArgs e)
    {
      if (this.WindowState == WindowState.Maximized)
        this.WindowState = WindowState.Normal;
      else
        this.WindowState = WindowState.Maximized;
    }

    private void imageClose_MouseUp(object sender, MouseButtonEventArgs e)
    {
      this.Close();
    }

    private void imageMinimize_MouseUp(object sender, MouseButtonEventArgs e)
    {
      this.Visibility = Visibility.Hidden;
    }

    #endregion

    #region Menu Control

    private Buttons button = Buttons.BirthdayList;

    private void buttonPhoneList_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
      SetColumns(Buttons.PhoneList);
    }

    private void buttonCellPhoneList_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
      SetColumns(Buttons.CellPhoneList);
    }

    private void buttonBirthdayList_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
      SetColumns(Buttons.BirthdayList);
    }

    public void SetColumns(Buttons buttons)
    {
      this.WindowState = WindowState.Normal;
      this.Visibility = Visibility.Visible;
      this.button = buttons;
      PhoneColumn.Visibility = Visibility.Visible;
      CellphoneColumn.Visibility = Visibility.Visible;
      EmailColumn.Visibility = Visibility.Visible;
      BirthdayColumn.Visibility = Visibility.Visible;
      switch (button) {
        case Buttons.BirthdayList:
          labelHeadline.Content = "Handyliste";
          BirthdayColumn.Visibility = Visibility.Collapsed;
          CellphoneColumn.Visibility = Visibility.Collapsed;
          break;
        case Buttons.CellPhoneList:
          labelHeadline.Content = "Telefonliste";
          BirthdayColumn.Visibility = Visibility.Collapsed;
          PhoneColumn.Visibility = Visibility.Collapsed;
          break;
        case Buttons.PhoneList:
          labelHeadline.Content = "Geburtstagsliste";
          PhoneColumn.Visibility = Visibility.Collapsed;
          CellphoneColumn.Visibility = Visibility.Collapsed;
          break;
      }
    }

    #endregion

    private void textBoxSearch_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
    {
      if (employees == null)
        return;
      ICollectionView view = GetEmployees();
        view.Filter = delegate(object item)
        {
          return ((Employee)item).ToString().ToLower().Contains(textBoxSearch.Text.ToLower());
        };
    } 
  }

Wie beschrieben wird bei einem Tastenanschlag aber gar nicht der Eventhandler textBoxSearch_TextChanged aufgerufen.

Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 13 Jahren

OK. Ich habe das Problem neu eingegrenzt. Ich habe folgende Schritte ausgeführt, um das ganze zu reproduzieren:

  1. Neue Solution mit Windows Forms-Projekt einer Form und einem Button.
  2. In der gleichen Solution neue WPF Benutzersteuerelementbibliothek
  3. In der Bibliothek ein neues WPF Fenster erzeugen und eine TextBox drauf.
  4. Verweise im Windows Forms Projekt setzen auf die WPF-Bibliothek und alle erforderlichen WPF-DLLs (Presentationframework, Presentationcore, Windowsbase).
  5. im OnClick-Ereignis des Buttons:
WpfControlLibrary1.Window1 w = new WpfControlLibrary1.Window1();       
w.Show();
  1. Starten und da isses, mein Problem
Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 13 Jahren

Konnte das Problem schon jemand reproduzieren?

151 Beiträge seit 2009
vor 13 Jahren

Hallo,

hast du mal ein bisschen mit dem Event herumprobiert?

Kannst du dein Projekt mal hochladen? oder nur in Teilen?

Grüßle
Jéré

Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 13 Jahren

Hier das Testprojekt. Danke schonmal.

151 Beiträge seit 2009
vor 13 Jahren

Moin,

leider kann ich dir das Verhalten nicht erklären. Allerdings ist mir aufgefallen, dass du in deiner WPF-Benutzersteuerelementebibliothek kein UserControl sondern ein Window hast. Es könnte daran liegen. Probiers doch mal anders.
Oder brauchst du unbedingt ein Window?

Grüßle
Jéré

32 Beiträge seit 2008
vor 13 Jahren

Hi!

Zwei Dinge wurden vergessen:

  1. Einbinden der Reference "WindowsFormsIntegration" im WinForms Projekt
  2. Bevor das WPF Window geöffnet wird, muss folgens aufgerufen werden:

      WpfControlLibrary1.Window1 w = new WpfControlLibrary1.Window1();
      ElementHost.EnableModelessKeyboardInterop(w); //for interop
      w.Show();

Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 13 Jahren

Funktioniert. Vielen Dank!
Man lernt halt nie aus.