#uwp #uwp-xaml
#uwp #uwp-xaml
Вопрос:
У меня есть UWP, в котором у меня есть пользовательский элемент управления, определенный в file1.xaml
<UserControl>
<Grid x:Name="A">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="DemoStates">
<VisualState x:Name="State1"/>
<VisualState x:Name="State2">
<Storyboard
x:Name="StoryboardDemo"
FillBehavior="HoldEnd">
<DoubleAnimationUsingKeyFrames
EnableDependentAnimation="True"
Storyboard.TargetName="DemoStateChange"
Storyboard.TargetProperty="(SomeProperty)">
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid x:Name="StoryboardDemo">
<Image
Source="//assets//Image1.jpg"/>
<Image
Source="//assets//Image2.jpg"/>
</UserControl>
Я использую этот пользовательский элемент управления внутри другого файла xaml file2.xaml
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<control:file1/>
<ToggleSwitch
Grid.Row="1"
Toggled="{x:Bind ViewModel.ChangeImage}"/>
</Grid>
Если пользователь переключает переключатель на раскадровке, он должен перейти в состояние 2, а если он выключен, он должен перейти в состояние 1.Я пытаюсь управлять этой раскадровкой через модель представления
File2ViewModel.cs
public void ChangleImage(object sender, RoutedEventArgs e)
{
Windows.UI.Xaml.Controls.ToggleSwitch toggleSwitch = sender as Windows.UI.Xaml.Controls.ToggleSwitch;
if (toggleSwitch != null)
{
if (toggleSwitch.IsOn == true)
{
VisualStateManager.GoToState(file1 , "state2", false); //get an error for the first parameter
}
else
{
VisualStateManager.GoToState(file1, "state1", false);//get an error for the first parameter
}
}
Как мне запустить пользовательский элемент управления для запуска раскадровки из ViewModel? Также, если переключатель переключен, я хотел бы отправить значение для управления «someproperty» обратно пользовательскому элементу управления, чтобы он мог управлять представлением на основе этого, возможно ли этого добиться?
Комментарии:
1.
file1
это имя класса, а не объект управления, который вы создали в коде Xaml. Вы могли бы дать usercontrol имя, подобное<local:file1 x:Name="MyControl1"/>
. Затем вызовите метод, подобныйVisualStateManager.GoToState(MyControl1, "state2", false);
2. Я попытался получить доступ к «Control1», но по-прежнему получаю ошибки в VisualStateManager, в которых говорится, что контекст не найден. У меня есть что-то вроде этого <control:file1 x:Name=»MyControl1″/> и VisualStateManager . GoToState(MyControl1, «state2», false);
Ответ №1:
Я неправильно понял ваш код. Вы помещаете ChangleImage method
в ViewModel. Вы можете установить свойство в File2ViewModel
и назначить элемент управления этому свойству.
Я сделал простую демонстрацию на основе вашего сценария
File2ViewModel:
public class File2ViewModel
{
public file1 thefile { get; set; }
public File2ViewModel(file1 file)
{
thefile = file;
}
public void ChangleImage(object sender, RoutedEventArgs e)
{
Windows.UI.Xaml.Controls.ToggleSwitch toggleSwitch = sender as Windows.UI.Xaml.Controls.ToggleSwitch;
if (toggleSwitch != null)
{
if (toggleSwitch.IsOn == true)
{
VisualStateManager.GoToState(thefile, "state2", false); //get an error for the first parameter
Debug.WriteLine("test");
}
else
{
VisualStateManager.GoToState(thefile, "state1", false);//get an error for the first parameter
Debug.WriteLine("test");
}
}
}
}
В коде file2 за:
public File2ViewModel viewModel { get; set; }
viewModel = new File2ViewModel(MyControl1);
MyControl1
это элемент управления file1, который вы добавили в file2 xaml.