如何防止silverlight验证弹出窗口出现在屏幕的一半

如何防止silverlight验证弹出窗口出现在屏幕的一半,silverlight,validation,popup,Silverlight,Validation,Popup,我有一个silverlight 4应用程序,它有一些与页面一样宽的文本框 当出现验证错误时,当用户单击控件时,将显示一个弹出窗口 问题是-它只在文本框左侧显示这些长文本框的弹出窗口。它不会在页面上方或下方显示,因此,大部分弹出窗口都会显示在页面外,因此会被截断 我知道我可以重新设置文本框的模板,并尝试自己调整弹出窗口,但在这样做之前,我只想检查是否有人知道一个简单的属性或我可以用来防止这种情况发生的东西 干杯 棒。好问题。我想我会尝试通过一种“智能的”AttachedProperty来解决这个问

我有一个silverlight 4应用程序,它有一些与页面一样宽的文本框

当出现验证错误时,当用户单击控件时,将显示一个弹出窗口

问题是-它只在文本框左侧显示这些长文本框的弹出窗口。它不会在页面上方或下方显示,因此,大部分弹出窗口都会显示在页面外,因此会被截断

我知道我可以重新设置文本框的模板,并尝试自己调整弹出窗口,但在这样做之前,我只想检查是否有人知道一个简单的属性或我可以用来防止这种情况发生的东西

干杯


棒。

好问题。我想我会尝试通过一种“智能的”
AttachedProperty
来解决这个问题。 预发伪代码:

<TextBox ... my:PopupUtils.KeepPopupWithinScreen="True"/>

以及(伪c#)代码:

公共静态类PopupUtils
{
//记住:伪代码,只是为了得到这个想法
static AttachedProperty KeepPopupWithinScreen=类型:bool,默认值:false,
一旦更改:HandleKeepPopupWithinscreen已更改;
私有静态无效HandleKeepPopupWithinsScreen已更改(
DependencyObject对象,布尔值)
{
obj.Loaded+=HandleTargetElementLoaded;
}
私有staic void HandletTargetElementLoaded(对象发送方,…)
{
var popup=VisualTreeHelper.GetDecentAndOfType(发送方);
如果(弹出!=null)
{
var offsetController=新的offsetController();
offsetController.SetBinding(ObservedOffsetProperty,
新绑定(“HorizontalOffset”){Source=popup});
offsetController.ControlledTarget=弹出窗口;
//现在为了防止垃圾收集。。。
SetAttachedOffsetController(弹出窗口,offsetController);
}
}
public static AttachedProperty AttachedOffsetController=类型:OffsetController;
}

我有时会这样做,所以这个模式实际上运行得很好。也许一开始感觉有点“不自然”。

只是让你知道我用来解决这个问题的方法

这是另一个StackOverflow问题,我丢失了对它的引用,因此我为没有正确引用它表示歉意,但问题是由于文本框和其他控件样式在显示验证消息时在控件的一侧有一个固定的位置

我只需创建样式的副本,并将弹出窗口显示在控件的顶部而不是旁边

问题解决了

干杯


Rod.

你好,Martin,谢谢。我会把这段代码编好,然后试一试——非常感谢。我会让你知道事情的进展。
public static class PopupUtils
{
    // remember: pseudo code, just to get the idea
    static AttachedProperty KeepPopupWithinScreen = type: bool, default: false,
        onChanged: HandleKeepPopupWithinScreenChanged;

    private static void HandleKeepPopupWithinScreenChanged(
        DependencyObject obj, bool value)
    {
         obj.Loaded += HandleTargetElementLoaded;
    }

    private staic void HandleTargetElementLoaded(object sender, ...)
    {
        var popup = VisualTreeHelper.GetDecendantOfType<Popup>(sender);
        if ( popup != null )
        {
            var offsetController = new OffsetController();
            offsetController.SetBinding(ObservedOffsetProperty,
                new Binding("HorizontalOffset"){Source=popup});
            offsetController.ControlledTarget = popup;
            //now to prevent garbageCollection...
            SetAttachedOffsetController(popup,offsetController);
        }
    }

    public static AttachedProperty AttachedOffsetController = type:OffsetController;

}