Следующее решение использует TextBox
для отображения пароля в виде обычного текста и PasswordBox
для маскировки пароля. PasswordBox
находится над TextBox
, поэтому сначала вы увидите замаскированный пароль. Когда флажок «показать пароль» установлен, PasswordBox
скрыт, что показывает TextBox
внизу (и пароль в виде обычного текста). Вот XAML:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</Window.Resources>
<StackPanel>
<Grid>
<TextBox
Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}"
/>
<PasswordBox
x:Name="PasswordBox"
PasswordChanged="OnPasswordChanged"
Visibility="{Binding HidePassword, Converter={StaticResource VisibilityConverter}}"
/>
</Grid>
<CheckBox
Content="Show password"
IsChecked="{Binding ShowPassword}"
/>
</StackPanel>
Он не использует MVVM для всего (обратите внимание на обработчик событий OnPasswordChanged
). Это потому, что PasswordBox
не может использовать привязку, поэтому пароль должен быть установлен в коде позади. Но прежде чем показать это, вот модель представления:
public class ViewModel : ViewModelBase
{
private string _password;
public string Password
{
get => _password;
set => Set(ref _password, value);
}
private bool _showPassword;
public bool ShowPassword
{
get => _showPassword;
set
{
Set(ref _showPassword, value);
RaisePropertyChanged(nameof(HidePassword));
}
}
public bool HidePassword => !ShowPassword;
}
Методы Set
происходят из родительского класса ViewModelBase
, который является частью легкого инструментария MVVM. Метод Set
просто устанавливает поле поддержки свойства и вызывает событие PropertyChanged
для этого свойства.
Наконец, вот код:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
InitializeViewModel();
}
public ViewModel ViewModel => DataContext as ViewModel;
private void InitializeViewModel()
{
DataContext = new ViewModel();
ViewModel.PropertyChanged += (sender, args) =>
{
// Update the password box only when it's not visible;
// otherwise, the cursor goes to the beginning on each keystroke
if (!PasswordBox.IsVisible)
{
if (args.PropertyName == nameof(ViewModel.Password))
PasswordBox.Password = ViewModel.Password;
}
};
}
private void OnPasswordChanged(object sender, RoutedEventArgs e)
{
ViewModel.Password = PasswordBox.Password;
}
}
После установки для DataContext
нового ViewModel
, мы слушаем изменения в свойстве Password
, чтобы обновить его в [ 1118]. Обратите внимание, что мы делаем это только тогда, когда PasswordBox
не виден (в противном случае курсор устанавливается на начало при каждом нажатии клавиши, и мы в конечном итоге возвращаем пароль!)
Обработчик событий просто обновляет [ 1120] в модели представления всякий раз, когда она изменяется в PasswordBox
.
Код для «подтверждения пароля» TextBox
и PasswordBox
будет очень похожим.
Нет - Вы не можете загрузить CLR в тот же процесс дважды. См. документацию для Хостинга CLR
Как с более ранними версиями времени выполнения, функция CorBindToRuntimeEx инициализирует время выполнения. Можно выбрать, какую версию времени выполнения загрузить, но процесс может разместить только одну версию.
Для случая № 1, там какая-либо конкретная причина (скажите, повредив изменения), который требует, чтобы библиотека была размещена в 1,1 временах выполнения? Действительно ли возможно подвергнуть библиотеку через 1.1 скомпилированный веб-сервис и иметь исполняемую точку к веб-сервису вместо этого? (Или некоторый другой метод дистанционной работы, для получения библиотеки в ее собственном процессе?)
Для случая № 2 действительно ли возможно перекомпилировать 1,1 приложения под 2.0/3.5, таким, что он может находиться в том же процессе?
В любом случае Rob Walker прав (и я upvoted) - Вы просто не можете разместить 2 версии времени выполнения в том же процессе. Таким образом, необходимо работать вокруг этого так или иначе. Я предположил бы, что в обоих случаях, источник должен быть доступным, таким образом, перекомпиляции и перетестирование должны играть.
. СЕТЕВЫЕ 4 обещания включить разместить различных версий CLR в том же процессе посредством Незавершенный Рядом .