TL; DR: Попробуйте использовать Html.Partial
вместо Renderpage
Я получал Object reference not set to an instance of an object
, когда пытался сделать вид в представлении, отправив ему модель, например это:
@{
MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null
Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:
@{
MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);
И это сработало.
Кроме того, причина, по которой я не имел Html.Partial
для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach
, хотя это не ошибка:
@inherits System.Web.Mvc.WebViewPage
@{
ViewBag.Title = "Entity Index";
List<MyEntity> MyEntities = new List<MyEntity>();
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
}
<div>
@{
foreach(var M in MyEntities)
{
// Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
@Html.Partial("MyOtherView.cshtml");
}
}
</div>
Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach
, чтобы выглядеть так:
@foreach(var M in MyEntities){
...
}
Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .
Я не уверен, что ты сможешь. Вам нужно использовать компонент макета GridPane
. В этом компоненте вы можете указать ограничения строк и столбцов, и в этих ограничениях вы можете указать ширину в процентах. Например:
<GridPane>
<children>
<TitledPane text="testGridPane" GridPane.columnIndex="0" GridPane.rowIndex="0" />
</children>
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="80.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
Этот код определяет GridPane
с первым столбцом шириной 80%. TitledPane
устанавливается в первой ячейке первого столбца этого GridPane
и может (потому что вы должны быть уверены, что ограничения ширины TitledPane
соответствуют вашим потребностям) занимают 80% от ширины GridPane
.
Обратите внимание, что я удалил всю информацию, не относящуюся к вашему вопросу. Кстати, инструмент Oracle Scene Builder очень полезен для определения сложного макета FXML.
Кажется, что многие ответы уже предоставлены, и они должны работать. Тем не менее, есть способ установить проценты:
<fx:define>
<Screen fx:factory="getPrimary" fx:id="screen" />
</fx:define>
Это поможет вам определить размеры текущего экрана, приложение отображается. Теперь, когда у нас есть размеры дисплея, мы можем играть с ним в FXML следующим образом:
<HBox fx:id="hroot" prefHeight="${screen.visualBounds.height}" prefWidth="${screen.visualBounds.width}"> Your FXML elements inside the root... </HBox>
Обратите внимание, что я использую visualBounds, так как это обеспечит мне доступное пространство на экране, t требуется перекрытие с панелью задач в Windows, например. Для полноэкранных приложений вы просто используете «границы».
Теперь, чтобы приблизиться к процентам, вы можете играть со значением prefheight и prefWidth. Вы можете поместить вычисления внутри $ {}.
Необязательно:
Если вы хотите, чтобы все ваши элементы использовали относительные размеры, просто обратитесь к ним, используя свой идентификатор, свойство ширины или высоты и сделайте свой расчет.
<VBox fx:id="VBSidebar" prefWidth="${hroot.width*0.15}" prefHeight="${hroot.height}"> more elements.. </VBox>
Надеюсь, что это поможет!
Вы можете имитировать его - базовый пример, который имитирует 50% для двух столбцов в HBox. Вы можете добавить фиктивные панели для получения третей и т. Д.
HBox {
VBox {
static hgrow : "ALWAYS",
Label {
text : "Privacy",
alignment : "CENTER",
styleClass : ["h2", "heading"]
}
},
VBox {
static hgrow : "ALWAYS",
Label {
text : "Messages",
alignment : "CENTER",
styleClass : ["h2", "heading"]
},
Label {text:""}
}
}