C# 如何从实现页面访问自定义控件中的按钮?
我的generic.xaml包含以下代码:C# 如何从实现页面访问自定义控件中的按钮?,c#,silverlight,custom-controls,C#,Silverlight,Custom Controls,我的generic.xaml包含以下代码: <ControlTemplate TargetType="local:customVideoControl"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="600"/> <RowDefinition Height="200"/&
<ControlTemplate TargetType="local:customVideoControl">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="600"/>
<RowDefinition Height="200"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<MediaElement x:Name="customMediaPlayer" Source="{TemplateBinding CustomMediaSource}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}"
Grid.Row="0" Grid.ColumnSpan="3"
/>
<ToggleButton x:Name="playPauseBtn" Height="50" Width="50" Content="Pause" Grid.Row="1" Grid.Column="0"/>
<Button x:Name="prevBtn" Height="50" Width="50" Content="Prev" Grid.Row="1" Grid.Column="1"/>
<Button x:Name="nextBtn" Height="50" Width="50" Content="Next" Grid.Row="1" Grid.Column="2"/>
</Grid>
</ControlTemplate>
现在我想访问下一个TBTN,在我正在实现的页面中
CustomVideoControl myVControl=new CustomVideoControl();
这将创建控件的实例,但我想在单击
下一步和上一步按钮,thta出现在generic.xaml中的CustomVideoControl中。任何帮助都将不胜感激
谢谢,
Subhen您可以在自定义控件中创建公共事件,例如NextButtonClicked和PreviousButtonClicked。我感觉,您正在尝试模仿事件设置者的行为。如果我是对的,请看看这个简单的例子:
<Style TargetType="{x:Type Button}" x:Key="SomeID">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Cursor" Value="Hand"></Setter>
<Setter Property="FontWeight" Value="Bold"></Setter>
</Trigger>
</Style.Triggers>
<EventSetter Event="MouseUp" Handler="DoSomething_Click"></EventSetter>
</Style>
从现在起,您可以直接从控件的控制控件中访问MovedNext上的和MovedPrevious上的
很抱歉,如果我之前的回答让人困惑,但它应该只是一个灵感,告诉我该怎么做:)
编辑:
我没有注意到这只涉及Silverlight,对此我深表歉意:)但是,如果您想尝试,它非常适合WPF。您只需要向控件添加几个事件
public event EventHandler MovedPrevious
public event EventHandler MovedNext
现在,这通常是这样实现的:-
protected virtual void OnMovedPrevious(EventArgs e)
{
var handler = MovedPrevious;
if (handler != null)
handler(this, e);
}
protected virtual void OnMovedNext(EventArgs e)
{
var handler = MovedNext;
if (handler != null)
handler(this, e);
}
现在,在现有的单击事件中:-
nextBtn.Click += (obj, Args) =>
{
customMediaPlayer.Source=new Uri(CustomMediaSource.ToString(),UriKind.RelativeOrAbsolute); //No idea what this doing
OnMovedNext(EventArgs.Empty);
};
prevBtn.Click += (obj, Args) =>
{
customMediaPlayer.Source = new Uri(CustomMediaSource.ToString(), UriKind.RelativeOrAbsolute); //No idea what this is doing either
OnMovedPrevious(EventArgs.Empty);
};
现在,在您的消费代码中,您可以执行以下操作:-
CustomVideoControl myVControl=new CustomVideoControl();
myVControl.MovedNext += (s, args) => { /* deal with next */ };
myVControl.MovedPrevious += (s, args) => { /* deal with previous */ };
对不起,你做错了。 没有充分的理由说明为什么应该在DataTemplate IMO中引用元素。
[……]你想做什么,为什么不管它不是控件的功能,如果你不将责任移交给控件,那么创建控件似乎没有意义。我想在单击按钮时更改Uri,但Uri将在主应用程序中可访问。是否有一种方法可以声明依赖的Eventhandler或其他东西,以便在单击主页上的按钮时可以调用它。我尝试在silverlight中将此添加到我的generic.xaml中,似乎无效。ThanksIt对textblock完全有效:)发布一些代码,我会看看我能做些什么。抱歉,我将textblock更改为button,但它肯定会工作得很好。这对于手头的问题来说是完全不合适的。我不这么认为。很抱歉出现了一个“通用”xaml,但我只是从我的一个项目中粘贴了它来激发您的想法。安东尼,请注意,你在做完全相同的事情,只是在代码隐藏中。请查看我更新的答案以了解我的观点。请更新您的代码,因为现在它无效且无法编译。OnMovedNext和OnMovedPrevious应该有返回类型。我非常感谢你,伙计,我不确定我是否在CLR或其他方面做了违法的事情,但这正是我现在项目所需要的。Thanx一吨agn。如何以MVVM的方式实现这一点?我用这种方法工作,但我想用CaliburnMicro。因此,我会在我的虚拟机中使用MoveNext()方法,在我看来,我会说“这是可能的还是我完全疯了?我的意思与AnthonyWJones已经发布的答案完全相同。”。
protected virtual void OnMovedPrevious(EventArgs e)
{
var handler = MovedPrevious;
if (handler != null)
handler(this, e);
}
protected virtual void OnMovedNext(EventArgs e)
{
var handler = MovedNext;
if (handler != null)
handler(this, e);
}
nextBtn.Click += (obj, Args) =>
{
customMediaPlayer.Source=new Uri(CustomMediaSource.ToString(),UriKind.RelativeOrAbsolute); //No idea what this doing
OnMovedNext(EventArgs.Empty);
};
prevBtn.Click += (obj, Args) =>
{
customMediaPlayer.Source = new Uri(CustomMediaSource.ToString(), UriKind.RelativeOrAbsolute); //No idea what this is doing either
OnMovedPrevious(EventArgs.Empty);
};
CustomVideoControl myVControl=new CustomVideoControl();
myVControl.MovedNext += (s, args) => { /* deal with next */ };
myVControl.MovedPrevious += (s, args) => { /* deal with previous */ };