Мой стиль водяного знака блокирует информацию о моем текстовом поле

#c# #sql #wpf

#c# #sql #wpf

Вопрос:

Я не уверен, как еще это описать.

Проблема: я использую стиль для своего текстового поля WPF в app.xaml

 <Grid>
   <TextBox Style="{StaticResource WatermarkTextbox}" x:Name="Email" Height="30" Width="300" FontSize="20" FontFamily="Comic Sans MS" Margin="0 40 0 0" />
</Grid>
  

Когда у меня есть стиль в моем текстовом поле, я не могу получить записанную информацию в свой SQL. Это мой стиль в App.xaml:

 <local:BoolToVisibilityConverter x:Key="InputToVisibility"/>
<Style x:Key="WatermarkTextbox" TargetType="{x:Type TextBox}">
    <Setter Property="BorderBrush" Value="Black"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
             <ControlTemplate TargetType="{x:Type TextBox}">
                  <Border Background="{TemplateBinding Background}"
                          BorderBrush="{TemplateBinding BorderBrush}"
                          BorderThickness="{TemplateBinding BorderThickness}">
                      <Grid>
                          <TextBlock Text="Email...">
                              <TextBlock.Visibility>
                                  <MultiBinding Converter="{StaticResource InputToVisibility}">
                                        <Binding ElementName="Email" Path="Text.IsEmpty"/>
                                        <Binding ElementName="Email" Path="IsFocused"/>
                                    </MultiBinding>
                                </TextBlock.Visibility>
                            </TextBlock>
                            <TextBox x:Name="Email" Background="Transparent"/>
                        </Grid>
                    </Border>
             </ControlTemplate>
         </Setter.Value>
    </Setter>
</Style>
  

Потребовалось некоторое время, чтобы найти эту проблему. И на данный момент у меня совершенно нет идей.

Я получил его также для моего пароля, для экрана входа в систему. Но когда я запускаю код для поиска учетных данных, он ничего не возвращает. ЕСЛИ я удалю стиль, это решит все проблемы для меня. Кто-нибудь знает способ, которым я могу сохранить Waterstyle и заставить его работать одновременно?

Кнопка входа в C #:

 private void Button_Click(object sender, RoutedEventArgs e) // Login
    {
       SqlConnection sqlCon = new SqlConnection(@"Data Source=****;Initial Catalog=LoginDB;Integrated Security=True");

        try
        {
            if (sqlCon.State == System.Data.ConnectionState.Closed)
                sqlCon.Open();

            string query = "SELECT COUNT(1) FROM tblUser WHERE Username=@UserName AND Password=@Password";
            SqlCommand sqlCmd = new SqlCommand(query, sqlCon);
            sqlCmd.CommandType = System.Data.CommandType.Text;

            sqlCmd.Parameters.AddWithValue("@UserName", Email.Text);
            sqlCmd.Parameters.AddWithValue("@Password", Pass.Text);
            int count = Convert.ToInt32(sqlCmd.ExecuteScalar());

            if (count == 1)
            {
                Main.Content = new Page1();
                Framep.Visibility = Visibility.Visible;
                GridS.Visibility = Visibility.Hidden;
            }
            else
            {
                MessageBox.Show("Username or password is incorrect");
            }

        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.Message, "App Information");
        }
        finally
        {
            sqlCon.Close();
        } 
    }
}
  

SQL:

 go
USE [LoginDB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tblUser](
    [UserID] [int] NULL,
    [UserName] [nvarchar](50) NULL,
    [Password] [nvarchar](50) NULL
) ON [PRIMARY]

GO
  

Комментарии:

1. Я не вижу свойства TemplateBinding to Text . При чтении Email.Text он не будет считываться Text из внутреннего TextBox .

2. Для правильного способа создания шаблонов ваших элементов управления посмотрите на: learn.microsoft.com/en-us/dotnet/framework/wpf/controls / …

3. Вы используете шаблон управления для своего текстового поля. Этот шаблон управления сам использует текстовое поле для представления вашего текстового поля, но это НЕ ваше текстовое поле. Текстовое поле, используемое шаблоном элемента управления, поддерживает свое собственное свойство Text, которое НЕ связано со свойством Text вашего текстового поля. Таким образом, пока вы вводите текст в текстовое поле, которое является частью шаблона элемента управления, свойство Text текстового поля, использующего этот шаблон элемента управления, не используется и не связано с текстовым полем шаблона элемента управления и, следовательно, остается неиспользуемым / пустым. Да, это немного запутанно, но именно в этом корень вашей проблемы.

4. Да, я это вижу. читал разные вещи, которые вы, ребята, говорили. Я вроде как понимаю свои ошибки. Хотя, к сожалению, я все еще не уверен на 100% в том, как я должен это исправить. Все еще немного новичок в этом.

5. По ссылке, которую я предоставил … эта часть творит чудеса. <ScrollViewer Margin="0" x:Name="PART_ContentHost" /> Скопируйте этот шаблон в свой проект и измените его по своему усмотрению

Ответ №1:

Вот!

Я немного изменил ваш стиль, чтобы дать вам представление о том, что делать. Я бы сказал https://learn.microsoft.com/en-us/dotnet/framework/wpf/controls/textbox-styles-and-templates все еще есть способ сделать это правильно!

 <Style x:Key="WatermarkTextbox" TargetType="{x:Type TextBox}">
                <Setter Property="BorderBrush" Value="Black"/>
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TextBox}">
                            <Border Background="{TemplateBinding Background}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}">
                                <Grid>
                                    <ScrollViewer x:Name="PART_ContentHost" />
                                    <TextBlock x:Name="TxBlkEmail" Text="Email..." Visibility="Collapsed">
                                    </TextBlock>
                                </Grid>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="Text" Value="{x:Null}">
                                    <Trigger.Setters>
                                        <Setter TargetName="TxBlkEmail" Property="Visibility" Value="Visible"/>
                                    </Trigger.Setters>
                                </Trigger>
                                <Trigger Property="Text" Value="">
                                    <Trigger.Setters>
                                        <Setter TargetName="TxBlkEmail" Property="Visibility" Value="Visible"/>
                                    </Trigger.Setters>
                                </Trigger>

                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
  

Комментарии:

1. Да, похоже, это сработало! : D Потрясающе. Возился с кучей вещей. И это все благодаря ScrollViewer?

2. Как я уже говорил вам в моем предыдущем комментарии, это сотворит чудо.